欧拉项目 #3 的这段代码有什么问题

What is wrong with this code for Project Euler #3?

本文关键字:代码 问题 什么 段代码 项目      更新时间:2023-10-16
#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;
}

这是我为欧拉项目问题 3 编写的代码。我不明白为什么当我运行它时,它给了我 1471。这是一个很好的答案,但不是最大的答案。但是如果我更改i = 1471它会给我正确的答案 6857 ...问题出在哪里?为什么它不"自动"给我 6857 的好答案,而是 1471 当我从 2 开始时?

附言。我知道我不必在任何地方都使用long long

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

if (A > C) {
    C = A;
}

进行此修改后,代码将生成正确答案(演示)。

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

  • 尝试潜在的除数直到你达到A/2是低效的;你可以停在平方根(你明白为什么吗?)
  • 构建程序的方式中不需要检查素数
  • 通过尝试所有数字来检查素数,即数学定义的方式,效率非常低:你正在尝试太多保证不起作用的除数。同样,您可以在平方根处停止。如果你从 2 开始,而不是从 1 开始,在平方根处停止,并且没有发现除数,则数字是素数。