这是我的代码:
#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 ...没有区别......
答案 0 :(得分: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";
}
}
答案 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();
}