読者です 読者をやめる 読者になる 読者になる

AOJ 0054 Sum of Nth decimal places

小数の和 | Aizu Online Judge

#include <iostream>
using namespace std;

int main() {
	int a, b, n;

	while (cin >> a) {
		cin >> b >> n;

		int sum = 0;
		for (; n-- > 0;) {
			a = a % b * 10;
			sum += a / b;
		}
		cout << sum << endl;
	}
	return 0;
}

AOJ 0053 Sum of Prime Numbers

素数の和 | Aizu Online Judge


n個の素数を足すまでwhile文を回しただけ。

#include <iostream>
#include <numeric>
using namespace std;

int main() {
	bool prime[1000000];
	fill(prime, prime + 1000000, true);
	prime[0] = prime[1] = false;
	for (int i = 2; i * i < 1000000; i++) {
		for (int j = 2; j * i < 1000000; j++) {
			if (!prime[i * j]) continue;
			prime[i * j] = false;
		}
	}

	int n;
	while (cin >> n) {
		if (n == 0) break;

		int t = 0, sum = 0;
		while (n > 0) {
			if (!prime[++t]) continue;

			n--;
			sum += t;
		}
		cout << sum << endl;
	}
	return 0;
}

AOJ 0052 Factorial II

n の階乗 | Aizu Online Judge


因数5がいくつか計算する

#include <iostream>
using namespace std;

int main() {
	int n;
	while (cin >> n) {
		if (n == 0) break;

		int i = 0;
		while (n /= 5) i += n;

		cout << i << endl;
	}
	return 0;
}

AOJ 0046 Differential

標高差 | Aizu Online Judge


そのまんま、

#include <iostream>
using namespace std;

int main(){
	double n, ma = 0, mi = 1000000;
	while (cin >> n) {
		if (n > ma) ma = n;
		if (n < mi) mi = n;
	}
	cout << (ma - mi) << endl;
	return 0;
}

AOJ 0045 Sum and Average

合計と平均 | Aizu Online Judge


自分で四捨五入する関数書いたらエラー吐かれたのでしぶしぶstl使った...

#include <iostream>
#include <cmath>
using namespace std;

int main() {
	int n, w, sum = 0, i = 0;
	double ws = 0;
	char t;
	while (cin >> n) {
		cin >> t >> w;

		i++;
		sum += n * w;
		ws += w;
	}

	cout << sum << endl;
	cout << round(ws / i) << endl;

	return 0;
}

AOJ 0044 Prime Number II

最小の素数と最大の素数 | Aizu Online Judge


エラトステネスの篩で素数判定をした後に探索、愚鈍なコードを書いたと思う(numericインクルードしとけばfill仕えたのか...)

#include <iostream>
#include <numeric>
using namespace std;

int main() {
	bool prime[100000];
	fill(prime, prime + 100000, 1);
	prime[0] = prime[1] = false;
	for (int i = 2; i * i < 100000; i++) {
		for (int j = 2; i * j < 100000; j++) {
			if (!prime[i * j]) continue;
			prime[i * j] = false;
		}
	}

	int n;
	while (cin >> n) {
		int i = 0;
		for (int i = n - 1; i >= 0; i--) {
			if (prime[i]) {
				cout << i << " ";
				break;
			}
		}
		for (int i = n + 1; i < 100000; i++) {
			if (prime[i]) {
				cout << i << endl;
				break;
			}
		}
	}
	return 0;
}

AOJ 0043 Puzzle

パズル | Aizu Online Judge


1~9まで探索し、刻子か順子をできる場合にその牌を取り除いて最終的に同じ牌が二つあればiの数字を足したときにパズルができるという判定(麻雀の話)

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int tmp[10];

bool solve(int n, int f) {
	bool judge = false;
	if (f == 4) {
		for (int i = 1; i < 10; i++) {
			if (tmp[i] == 2) {
				return true;
			}
		}
		return false;
	}

	if (tmp[n] >= 3) {
		tmp[n] -= 3;
		judge = solve(n, f + 1);
		if (judge) return true;
		tmp[n] += 3;
	}

	if (n <= 7 && tmp[n] >= 1 && tmp[n + 1] >= 1 && tmp[n + 2] >= 1) {
		tmp[n]--; tmp[n + 1]--; tmp[n + 2]--;
		judge = solve(n, f + 1);
		if (judge) return true;
		tmp[n]++; tmp[n + 1]++; tmp[n + 2]++;
	}

	if (n < 9) {
		judge = solve(n + 1, f);
	}
	return judge;
}

int main() {
	string source;
	while (cin >> source) {
		int pai[10] = { 0 };
		for (int i = 0; i < 13; i++) {
			pai[source[i] - '0']++;
		}

		vector <int> v;
		for (int i = 1; i < 10; i++) {
			if (pai[i] < 4) {
				pai[i]++;
				for (int j = 0; j < 10; j++) {
					tmp[j] = pai[j];
				}
				if (solve(1, 0)) {
					v.push_back(i);
				}
				pai[i]--;
			}
		}

		if (v.empty()) cout << 0 << endl;
		else {
			for (int i = 0; i < (int)v.size() - 1; i++) {
				cout << v[i] << ' ';
			}
			cout << v[v.size() - 1] << endl;
		}
	}
	return 0;
}


配列の初期化にfillを使おうとすると必ずコンパイルエラーになるのなんでやろ...memsetとか言うのを使った方がいいのだろうか。