Project Euler#3的这段代码有什么问题?

时间:2014-04-04 15:22:11

标签: c++

#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

1 个答案:

答案 0 :(得分:6)

您的分解算法需要在CA之间进行选择,因为在流程结束时A包含余数,这也是原始{{1}的因子}。如果它恰好是最大的一个,那么你的代码就会错过它。

A

进行此修改后,您的代码会生成正确答案(demo)。

注意:既然您的程序正在运行,您可以考虑进行一些修改:

  • 在达到if (A > C) { C = A; } 之前尝试潜在的除数是效率低下的;你可以停在平方根(你知道为什么吗?)
  • 构建程序的方式不需要检查素数
  • 通过尝试所有数字(即数学定义的方式)来检查素数是非常低效的:你正在尝试太多的保证不起作用的除数。同样,你可以停在平方根。如果从2开始,而不是1,停在平方根处,找不到除数,则该数字为素数。