素数程序停在20,031的第一个素数,225,149,没有明显的原因。无错误消息

Prime number programs stops at 20,031'st prime, 225,149 for no apparent reason. No error message

本文关键字:消息 无错误 程序 第一个      更新时间:2023-10-16

为什么我的素数查找程序有效,但在20031的第1个素数225149处退出?没有错误消息,x代码声称程序"以退出代码结束",就像正常情况一样

我的问题不是关于程序本身,它似乎正在工作(寻找素数),而是我遇到了什么限制或计算错误,导致它退出。

这个循环是故意无限的,但它按预期打印到225149,然后停止并毫无错误地退出。它只是退出,就好像它到达了循环的末尾。我试着限制迭代次数,并将其一点一点地提高到100000000000,但奇怪的是,它停止了相同的数字,225149。

是否存在超出的计算时限或其他情况?

输出的最后一位:程序输出从零开始的素数计数,然后是素数。

20027)22510920028)22511920029)22513320030)22514320031)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();
}

问题是每次进行测试时i都会增加。在这种情况下,您可以轻松地进行20亿次测试。当i溢出时,其值变为负值,因此循环结束。

你可以做3件不同的事情来解决这个问题:

  • 第一种是将i的类型更改为unsigned intunsigned long long。这些类型总是积极的,你的循环永远不会结束。不同之处仅在于unsigned long long被写入64位而不是32位。

  • 第二种方法是更改循环中的条件;如果您希望它是无限的,您可以简单地使用1。这是一般的真实情况。

  • 最后一种方法是更改程序,在第一个循环中插入第二个循环,以确保在每次迭代中测试不同的数字。

最终int i将溢出。有符号整数溢出是未定义的行为,因此编译器可以随心所欲。

通常它会溢出到INT_MIN,它是负的,所以循环结束。

尝试将i设为long并打印其值以监视它。