#include <iostream>
using namespace std;
int prim( long long x ) {
int s = 0;
for( long long i = 1; i <= x ; i++ ) {
if( x % i == 0 ) {
s++;
}
}
if( s == 2 ) {
return 1;
}
return 0;
}
int main() {
long long A = 600851475143;
long long i = 2;
long long C = 0;
while( i < (A/2) ) {
while( A % i == 0 ) {
A = A / i;
if( i > C ) {
C = i;
}
}
i++;
}
if( prim(C) ) {
cout<<C;
}
return 0;
}
这是我为Project Euler problem 3制作的代码。我不明白为什么当我跑它时,它给了我1471.这是一个很好的答案,但不是最大的答案。但如果我改变i = 1471
它给了我正确的答案6857 ......问题出在哪里?为什么不自动&#34;自动&#34;给我一个好的6857答案,但是当我从2开始时是1471?
PS。我知道我不必在任何地方使用long long
。
答案 0 :(得分:6)
您的分解算法需要在C
和A
之间进行选择,因为在流程结束时A
包含余数,这也是原始{{1}的因子}。如果它恰好是最大的一个,那么你的代码就会错过它。
A
进行此修改后,您的代码会生成正确答案(demo)。
注意:既然您的程序正在运行,您可以考虑进行一些修改:
if (A > C) {
C = A;
}
之前尝试潜在的除数是效率低下的;你可以停在平方根(你知道为什么吗?)