Project Euler 47
連続する2つの数がそれぞれ2つの異なる素因数を持つのは
14 = 2 × 7
15 = 3 × 5 の場合である.
同様に連続する3つの数がそれぞれ3つの異なる素因数を持つのは644 = 22 × 7 × 23
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2047
645 = 3 × 5 × 43
646 = 2 × 17 × 19 の場合である.
連続する4つの数がそれぞれ4つの異なる素因数を持つ場合を考え, 連続する数の中で最小のものを答えよ.
#include <iostream> #include <deque> using namespace std; //素数を max まで計算する deque<bool> p; deque<int> prime; void calc_prime(const int max){ 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; } } for(int i=2 ; i<=max ; i++){ if(p[i]) prime.push_back(i); } } // nの素因数分解し、異なる素数の個数を返す。 // 4 = 2*2 なので ret=1 // 12 = 2*2*3 なので ret=2 // 30 = 2*3*5 なので ret=3 int factDistinctNum(int n){ int ret=0; int i=-1, k; bool t; while(n!=1){ i++; t=true; k=prime[i]; while(n%k==0){ n /= k; if(t){ ret++; t=false; } } } return ret; } int main(){ calc_prime(1000000); for(int i=1 ; i<1000000 ; i++){ if(factDistinctNum(i)!=4) continue; if(factDistinctNum(i+1)!=4){ i+=1; continue; } if(factDistinctNum(i+2)!=4){ i+=2; continue; } if(factDistinctNum(i+3)!=4){ i+=3; continue; } cout << i << " " << i+1 << " " << i+2 << " " << i+3 << endl; break; } }
計算時間がクソ。因数分解の部分をほんとはもう少し考えないといけないが・・・