Project Euler 58
1から初めて, 以下のように反時計回りに数字を並べていくと, 辺の長さが7の渦巻きが形成される.
37 36 35 34 33 32 31 38 17 16 15 14 13 30 39 18 5 4 3 12 29 40 19 6 1 2 11 28 41 20 7 8 9 10 27 42 21 22 23 24 25 26 43 44 45 46 47 48 49 面白いことに, 奇平方数が右下の対角線上に出現する. もっと面白いことには, 対角線上の13個の数字のうち, 8個が素数である. ここで割合は8/13 ≈ 62%である.
渦巻きに新しい層を付け加えよう. すると辺の長さが9の渦巻きが出来る. 以下, この操作を繰り返していく. 対角線上の素数の割合が10%未満に落ちる最初の辺の長さを求めよ.
#include <iostream> using namespace std; bool isPrime(long long num){ for(long long i=3 ; i<num/2 ; i++){ if(num%i==0) return false; } return true; } int main(){ long long allnum=1, primenum=0; long long i,k; for(i=2 ; ; i++){ for(int j=1 ; j<4 ; j++){ k = 4*i*i - (4+2*j)*i+(1+2*j); if(isPrime(k)){ primenum++; } } allnum+=4; cout << i << " " << (double)primenum/(double)allnum << endl; if((double)primenum/(double)allnum < 0.1) break; } cout << 2*i-1 << endl; int end; cin >> end; }
プログラム動かして寝て、朝起きたらできてたというレベルなので計算時間的にはダメ。書き直したいが今はいい方法が思いつかない。