在C ++中求解Project Euler和3时出错

时间:2012-02-14 13:58:30

标签: c++ codeblocks xterm

这是我的代码:

#include <iostream>

using namespace std;

int main()
{
    long int x = 1;
    long int res;

    while (x<600851475143)
    {
        x++;
        if(600851475143%x==0)
        {
            res=x;
            cout<<x<<"\n";
        }
    }
}

我不知道它有什么问题,但它给了我这个输出:

839
1471
6857
59569
104441
486847
1234169
5753023
10086647
87625999
408464633
716151937
-716151937
-408464633
-87625999
-10086647
-5753023
-1234169
-486847
-104441
-59569
-6857
-1471
-839
-71
-1
Floating point exception

Process returned 136 (0x88)  execution time : 156.566 s
Press ENTER to continue.

当我用13195替换600851475143 [在这个例子中] ... 它工作正常...并给我这个输出:

5
11
55
11149

Process returned 0 (0x0) execution time : 0.005 s
Press ENTER to continue.

我不知道我做错了什么...... :/ 也许我以前的程序运行不正常...我在开始时尝试使用int,然后将其更改为long int ...没有区别......

5 个答案:

答案 0 :(得分:2)

负值是溢出造成的。首先使用无符号整数而不是有符号整数。除此之外,在32位计算机中,long intint类型都是32位。

unsigned long long int x = 1;
unsigned long long int res;

此外,您可以强调这些常量是无符号的

while (x<600851475143U)
    {
        x++;
        if(600851475143U%x==0)
        {
            res=x;
            cout<<x<<"\n";
        }
    }

答案 1 :(得分:2)

如果您的正号突然++后变为负数,则表明integer overflow是肯定的。您需要选择能够容纳更大整数的数据类型,例如long long

另外,根据问题的要求,您的算法不会搜索最大的 prime 因子。它搜索最大因子,不一定是主要因素。

顺便说一下,如果你能证明在到达被考虑的数字的平方根时停止搜索是正确的,那么你可以大大加快你的程序。

答案 2 :(得分:1)

您的变量类型无法容纳12位数字。典型的unsigned long int可以存储0到4,294,967,295,对于签名 - -2,147,483,648到2,147,483,647。

答案 3 :(得分:1)

尝试使用unsigned long long,它应至少存储18,446,744,073,709,551,615(这个数字我甚至无法想象)。

答案 4 :(得分:1)

下面的代码将显示用户输入的数字的所有主要因素。但600851475143是一个太大的数字,无法找到其主要因素。修改此程序以查看600851475143的主要因素,并修改它以找出它们的最大主要因素。我已经学习了两个月的c ++,所以我可以帮助你这么多。一切都好。

            #include<iostream.h>
            #include<conio.h>
            class primefactor
                 {
                    unsigned long int a;
                  public:
                            void factor();

                  };
           void primefactor::factor() 
                 {
                     cout<<"Enter any number to see its prime factors";
                     cin>>a;
                     int count=0;
                     int count1=0;
                     for(unsigned long int loop1=a;loop1>=1;loop1--)
                         {
                            if(a%loop1==0)
                              {
                                 for(unsigned long int loop=loop1;loop>=1;loop--)
                                       {
                                         if(loop1%loop==0)
                                              {
                                                  count++;
                                               }
                                         }
                             if(count==2)
                                {
                                    count1++;
                                    cout<<loop1<<"\t";
                                 } 
                          }
                     count=0;
                    }
                       cout<<"\n"<<"There are"<<count1<<"\t"<<"prime factors";
                 }

           void main()
                 {
                    primefactor k;
                       clrscr();
                    k.factor();
                       getch();
                  }