-1

这是我的代码:

#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......没有区别......

4

5 回答 5

2

负值是由于溢出。首先使用无符号整数而不是有符号整数。除此之外,在 32 位计算机中,long int类型int都是 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";
        }
    }
于 2012-02-14T14:02:10.887 回答
2

当你的正数突然变成负数时,这肯定是整数溢出++的迹象。您需要选择一种能够容纳更大整数的数据类型,例如.long long

附带说明一下,您的算法没有按照问题的要求搜索最大的素数。它搜索最大的因子,不一定是素数。

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

于 2012-02-14T14:04:32.287 回答
1

您的变量类型不能容纳 12 位数的数字。典型unsigned long int可以存储从 0 到 4,294,967,295,用于有符号的 -2,147,483,648 到 2,147,483,647。

于 2012-02-14T14:02:39.750 回答
1

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

于 2012-02-14T14:07:16.240 回答
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();
                  }
于 2013-01-19T05:23:23.513 回答