为什么我的寻找素数的程序有效,但退出20,031'的素数,即225,149?没有错误消息和x-code声称程序“以退出代码结束”,就像通常那样。
我的问题不是关于程序本身,它似乎正在起作用(找到素数),但是我遇到了什么限制或计算错误导致它退出。
此循环有意无限,但按预期打印到225,149然后停止并退出而没有错误。它只是退出,好像它到达循环的结束。我已经尝试对迭代进行限制并将其一点一点地提升到10,000,0000,000,但它奇怪地停止了相同的数字,225,149。
是否超出了计算时间限制或其他?
输出的最后一位:程序从零输出素数计数,然后输出素数。
20027)225109 20028)225119 20029)225133 20030)225143 20031)225149 程序以退出代码结束:0
#include <iostream>
#include <cmath>
using namespace std;
//performs modulus and find remainder return remainder r to void primal
double fmodulus (double n, double d)
{
double r;
r= fmod(n, d);
return r;
}
//finds prime number using modulus double type modulus function fmod()
void primal()
{
int count=1;
double n=3.0, d=2.0;
for (int i= 0; i>=0; ++i)
{
double r;
r= fmodulus(n, d);
//if n==d then is prime nymber
if (n==d)
{
cout<<count<<") "<<n<<endl;
n++;
d=2.0;
count++;
}
//if remainder == 0 then not prime number
else if (r==0)
{
n++;
d=2.0;
}
//not prime so updates d of modulus increment by 1
else
{
d++;
}
}
}
int main(int argc, const char * argv[])
{
cout<<endl;
primal();
}
答案 0 :(得分:2)
最终int i
会溢出。有符号整数溢出是未定义的行为,因此编译器可以做任何想做的事情。
通常它会溢出到INT_MIN,这是负数,所以你的循环结束。
尝试将i
设为long
并打印其值以进行监控。
答案 1 :(得分:2)
每次进行测试时i
递增的问题。在这种情况下,您可以轻松达到20亿次测试。当i
溢出时,其值变为负值,因此循环结束。
你可以做3件不同的事来解决这个问题:
第一种是更改i
的类型,使其成为unsigned int
或unsigned long long
。这些类型总是积极的,你的循环永远不会结束。不同之处仅在于unsigned long long
写入64位而不是32位。
第二种方法是改变循环中的条件;如果你希望它是无限的,你可以简单地使用1
。这是一般的真实情况。
最后一种方法是更改程序,在第一个循环中插入第二个循环,以确保在每次迭代时测试不同的数字。