我尝试了欧拉计划中最大的素数因素

时间:2012-09-22 07:45:13

标签: c++ integer long-integer biginteger

它适用于小数字,但拒绝为正在检查的数字输出更多因素" 600851475143"。这是我的代码,请注意,我是c ++的新手

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;


int main() 
{
    int value;
    vector<int>v1;

    cout << "Enter Value: ";
    cin >> value;

    for(int index=2 ; index<=(value/2); index++)
    {
        if (value% index==0)
        {
            v1.push_back(index);
        }
    }

    cout<<"The Numbers are:";
    for (vector<int>::iterator it = v1.begin(); it != v1.end(); ++it)
    {
        cout<<" "<< *it << endl;
    }

    return 0;
}

3 个答案:

答案 0 :(得分:1)

这个数字,你试图找到解决方案是非常大的。所以你的这个程序有两个问题。

  1. for(i=2 ;i<=(Value/2); i++)可以通过检查sqrt
  2. value来改进
  3. int很小,适用于600851475143,请改用long long
  4. 编辑 - 下面的剧透

      

    这家伙正在解决同样的问题 - Java - Can't make ProjectEuler 3 Work for a very big number (600851475143)

答案 1 :(得分:0)

原因可能是int不能存储600851475143,因此会出现溢出,导致(可能)负数。您可以从攀爬中检查MAX_INT或使用最大限制。

如果你想用如此大的数字进行计算,你应该尝试使用BigInt类型。

另请注意:您似乎首先检查数字是否均匀,然后是否可以除以3等。优化可能是使用i + = 2并在检查数字是否为3之后从3开始甚至,而不是i ++,因为2 + = 2n始终是偶数。

答案 2 :(得分:0)

  • 使用 unsigned long long 数据类型,如果您的拱门支持该数据类型就足够了。
  • 其次,从2迭代到int(sqrt(Value)),预先计算这个值,当然
  • 添加 v1.reserve(值/ 4); 以避免多次向量重新分配
  • 如果你想找到最大素数因子 - 从值/ 2迭代到2并简单地找到第一个
  • 避免检查除2
  • 之外的偶数