素数项目停留在20,031',而无明显原因的225,149。没有错误消息

时间:2014-09-28 06:13:30

标签: c++

为什么我的寻找素数的程序有效,但退出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();
}

2 个答案:

答案 0 :(得分:2)

最终int i会溢出。有符号整数溢出是未定义的行为,因此编译器可以做任何想做的事情。

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

尝试将i设为long并打印其值以进行监控。

答案 1 :(得分:2)

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

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

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

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

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