Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 素数程序在20031';st prime,225149,没有明显的原因。没有错误消息_C++ - Fatal编程技术网

C++ 素数程序在20031';st prime,225149,没有明显的原因。没有错误消息

C++ 素数程序在20031';st prime,225149,没有明显的原因。没有错误消息,c++,C++,为什么我的寻找素数的程序可以工作,但是在2003年的第一个素数(225149)退出?没有错误消息,x-code声称程序“以退出代码结束”,与正常情况一样 我的问题不是关于程序本身,它似乎在工作(寻找素数),而是我遇到的导致它退出的极限或计算错误 这个循环有意是无限的,但它按预期打印到225149,然后停止并退出,没有错误。它只是退出,就好像它到达了一个循环的末尾。我曾尝试对迭代次数进行限制,并一点一点地将其增加到10000000000次,但奇怪的是,它停止了相同数量的迭代,225149次 是否有

为什么我的寻找素数的程序可以工作,但是在2003年的第一个素数(225149)退出?没有错误消息,x-code声称程序“以退出代码结束”,与正常情况一样

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

这个循环有意是无限的,但它按预期打印到225149,然后停止并退出,没有错误。它只是退出,就好像它到达了一个循环的末尾。我曾尝试对迭代次数进行限制,并一点一点地将其增加到10000000000次,但奇怪的是,它停止了相同数量的迭代,225149次

是否有超出计算时限的情况或其他情况

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

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();
}
#包括
#包括
使用名称空间std;
//执行模运算并查找余数返回余数r以作废原始值
双模(双n,双d)
{
双r;
r=fmod(n,d);
返回r;
}
//使用模双类型模函数fmod()查找素数
空原()
{
整数计数=1;
双n=3.0,d=2.0;
对于(int i=0;i>=0;++i)
{
双r;
r=fmodulus(n,d);
//如果n==d,则为素数nymber
如果(n==d)
{

cout最终int
i
将溢出。有符号整数溢出是未定义的行为,因此编译器可以执行任何它想要的操作

通常它只会溢出到INT_MIN,这是负数,因此循环结束


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

最终int
i
将溢出。有符号整数溢出是未定义的行为,因此编译器可以执行任何它想要的操作

通常它只会溢出到INT_MIN,这是负数,因此循环结束


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

问题是
i
在每次进行测试时都会递增。在这种情况下,很容易达到20亿次测试。当
i
溢出时,其值变为负值,因此循环结束

您可以执行3种不同的操作来解决此问题:

  • 第一种方法是更改
    i
    的类型,使其成为
    unsigned int
    unsigned long
    。这些类型总是正的,循环永远不会结束。区别在于
    unsigned long
    是在64位而不是32位上写入的

  • 第二种方法是更改循环中的条件;如果希望它是无限的,只需使用
    1
    。这是一般的真实条件

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


每次进行测试时,
i
的问题si都会增加。在这种情况下,很容易达到20亿次测试。当
i
溢出时,其值变为负值,因此循环结束

您可以执行3种不同的操作来解决此问题:

  • 第一种方法是更改
    i
    的类型,使其成为
    unsigned int
    unsigned long
    。这些类型总是正的,循环永远不会结束。区别在于
    unsigned long
    是在64位而不是32位上写入的

  • 第二种方法是更改循环中的条件;如果希望它是无限的,只需使用
    1
    。这是一般的真实条件

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


变量
i
的意义是什么?它根本不在循环中使用。变量
i
的意义是什么?它根本不在循环中使用。有更高效的算法生成素数。(我们知道3之后的所有素数的形式都是6n-1或6n+1,n=1,2,3…所以我们只需要检查该形式的除数,以及直到候选数平方根的除数。)但是,在不改变所使用的算法的情况下,您可以通过将
n++
替换为
n=n+2
来改进它……不需要检查任何偶数是否为素数,只需要检查奇数。有更有效的生成素数的算法。(我们知道3之后的所有素数的形式都是6n-1或6n+1,n=1,2,3…所以我们只需要检查该形式的除数,以及直到候选数平方根的除数。)但是,在不改变所使用的算法的情况下,您可以通过将
n++
替换为
n=n+2
来改进它……不需要检查任何偶数是否为素数,您只需要检查奇数。+1.执行无限循环的几种方法,例如
while(1)
for(;)
,但当下一个候选(n)将超过数据类型的最大值,
int
long
时,对素数的检查将结束,因此我们确实不需要无限循环,只需循环直到n将超过数据类型的最大值。+1。执行无限循环的几种方法,例如,
while(1)
for(;;)
,但当下一个候选(n)将超过数据类型的最大值时,对素数的检查将结束,
int
long
,因此我们确实不需要无限循环,只需循环,直到n超过数据类型的最大值。