Project Euler で Level1 を25問解くことができた。めでたい。
Problem 69
106以下の自然数nについて、を最大化するnを出力せよ、という問題。
愚直にを計算していくと、めちゃくちゃな時間がかかってしんどい。
ぐらい。
実は
素数pに対して、
なので、
が成り立つ。
また、互いに素な自然数m,nに対して、
が成り立つ。
ということは……?
をある自然数の素因数とすると、
つまり、 の値は、nの素因数によってのみ決まる。
値の比較なんてする必要なかったんや……。
要するに
106を超えないように素数を小さい方から順に掛けて、106を超える直前でまた素数を小さい方から順に掛ける。
素数判定は試し割りでも十分に間に合った。
実装
#include <iostream> using namespace std; bool isprime(int n){ if(n <= 1) return false; if(n == 2) return true; for(int i=2;i*i<=n;i++) if(n % i == 0) return false; return true; } int main(){ int res = 1; for(int i=2;res*i<=1000000;++i) if(isprime(i)) res *= i; for(int i=2;res*i<=1000000;++i) res *= i; cout << res << endl; return 0; }