Project Euler 10
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million.
10以下の素数の和は2 + 3 + 5 + 7 = 17である。 200万以下の全ての素数の和を計算しなさい。
Mathematica
A = 0; For[i = 1, i < 2000000, i++, A += If[PrimeQ[i], i, 0] ] A
まだC言語的な書き方から抜け出せませんねぇ・・・
これは短く書いている方がたくさんいました。
Total@Select[Range@2000000, PrimeQ]
Total[Select[Table[i, {i, 2000000}], PrimeQ]]
C/C++
#pragma comment(lib,"mpir.lib") #include <iostream> #include <cmath> #include <mpir.h> #include <deque> using namespace std; int main(){ const int MAX = 2000000; deque<bool> p; for(int i=0 ; i<MAX+1 ; i++){ p.push_back(true); } p[0] = false; p[1] = false; double myEnd = sqrt(double(MAX)); for(int i=2 ; i < myEnd ; i++){ for(int j=2 ; i*j<=MAX ; j++){ p[i*j] = false; } } mpz_t n; mpz_init_set_str(n,"0",10); for(int i=1 ; i<=MAX ; i++) if(p[i]) mpz_add_ui(n, n, i); mpz_out_str(stdout , 10, n); return 0; }
mpir(多倍長演算ライブラリ)についてはProject Euler 3の記事をご参照ください。
最初はbool型の200万の大きさの配列を宣言しようとしていたのですが、あえなくStack Overflow。
奇数だけ入れるという条件でもできたと思うのですが、vector
ですがvector
dequeとvectorは似ているっぽいのですが、vector
実際に上記のコードは30秒ほどで結果を出してくれますが、dequeをvectorに変えてやってみたところ3分以上かかりました。
*1:Select[list,crit]: crit[ei]がTrueとなるlist のすべての要素[ei] を取り出す。