夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

AOJ No.0009 解決編

どうもです。

今日成績帰ってきて…


パソコンに制限掛けられましたorz

0009

とりあえず気をとり直して。

 /*
Write a program which reads an integer n (n ≤ 999999) and prints the number of prime numbers which are less than or equal to n. A prime number is a natural number which has exactly two distinct natural number divisors: 1 and itself. For example, the first four prime numbers are: 2, 3, 5, 7.
 */

#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;

 /* 
http://community.appliplanet.co.jp/community/beginner

[ポイント]
+nが素数でないならの平方根mより小さいもので割り切れるはず。
+予め2の倍数を除外する。
+数が大きくなるならばエラストテレスの篩をつかう←実装はbool[]を使う。
 */
void solve(int n) {
	bool prime[n+1];
	for (int i=0; i<n+1; i++)
		prime[i] = true;
	prime[0] = false; prime[1] = false;
	int m = (int)sqrt(n);					// nの平方根
	
	for (int i=2; i<=m; i++) {
		if(prime[i]) {
			for (int k=i*i; k<=n; k += i)
				prime[k] = false;
		}
	}
	
	int count = 0;
	for (int i=0; i<n+1; i++) {
		if (prime[i]) count++;
	}
	
	cout << count << endl;
}

int main() {
	int n;
	while (cin >> n) {
		solve(n);
	}
	return 0;
}

こんな感じになりました。
解説はコメント見て。

以上。それでは。