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

Error while solving Project Euler sum number 3 in C++

本文关键字:Euler 和数 3时 出错 Project C++      更新时间:2023-10-16

这是我的代码:

#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…没什么区别。。。

负值是由于溢出造成的。首先使用无符号整数而不是有符号整数。此外,在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";
        }
    }

当您的正数++之后突然变为负数时,这是整数溢出的确定符号。您需要选择一种能够容纳较大整数的数据类型,例如long long

另一方面,您的算法并没有按照问题中的要求搜索最大的素数因子。它搜索最大的因子,而这个因子不一定是素数。

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

您的变量类型不能包含12位数。典型的unsigned long int可以存储0到4294967295,对于已签名的-−2147483648到2147483647。

尝试使用unsigned long long,它应该至少存储18446744073709551615(这个数字我甚至无法想象)。

下面的代码将显示用户输入的数字的所有素数。但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();
                  }