これは、Project Euler の問題 3に対する私の解決策です。ソリューションをより効率的にする方法はありますか?
int largestPrimeFactor(unsigned _int64 x)
{
unsigned __int64 remainder = x;
int max_prime;
for (int i = 2; i <= remainder; i++)
{
while(remainder%i==0) {
remainder /= i;
max_prime = i;
}
}
return max_prime;
}
更新:提案をありがとうございました。それらに基づいて、次のようにアルゴリズムを変更しました。
1) 除数の候補もスキップします。
while(remainder%2==0) {
max_prime = 2;
remainder /= 2;
}
for (int i = 3; i <= remainder; i += 2)
{
while(remainder%i==0) {
max_prime = i;
remainder /= i;
}
}
2) 剰余の平方根まで計算します。
for (int i = 2; i*i <= remainder; i++)
{
while(remainder%i==0) {
max_prime = i;
remainder /= i;
cout << i << " " << remainder << endl;
}
}
if (remainder > 1) max_prime = remainder;
3)エラトステネスのふるいアルゴリズムを使用して事前に素数を生成します。この単純な例ではおそらく価値がありません。