C++ 素数程序在20031';st prime,225149,没有明显的原因。没有错误消息
为什么我的寻找素数的程序可以工作,但是在2003年的第一个素数(225149)退出?没有错误消息,x-code声称程序“以退出代码结束”,与正常情况一样 我的问题不是关于程序本身,它似乎在工作(寻找素数),而是我遇到的导致它退出的极限或计算错误 这个循环有意是无限的,但它按预期打印到225149,然后停止并退出,没有错误。它只是退出,就好像它到达了一个循环的末尾。我曾尝试对迭代次数进行限制,并一点一点地将其增加到10000000000次,但奇怪的是,它停止了相同数量的迭代,225149次 是否有超出计算时限的情况或其他情况 输出的最后一位:程序输出从零开始的素数计数,然后是素数 20027)225109 20028) 225119 20029) 225133 20030) 225143 20031) 225149 程序以退出代码结束:0C++ 素数程序在20031';st prime,225149,没有明显的原因。没有错误消息,c++,C++,为什么我的寻找素数的程序可以工作,但是在2003年的第一个素数(225149)退出?没有错误消息,x-code声称程序“以退出代码结束”,与正常情况一样 我的问题不是关于程序本身,它似乎在工作(寻找素数),而是我遇到的导致它退出的极限或计算错误 这个循环有意是无限的,但它按预期打印到225149,然后停止并退出,没有错误。它只是退出,就好像它到达了一个循环的末尾。我曾尝试对迭代次数进行限制,并一点一点地将其增加到10000000000次,但奇怪的是,它停止了相同数量的迭代,225149次 是否有
#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最终inti
将溢出。有符号整数溢出是未定义的行为,因此编译器可以执行任何它想要的操作
通常它只会溢出到INT_MIN,这是负数,因此循环结束
尝试将i
设为long
并打印其值以监视它。最终inti
将溢出。有符号整数溢出是未定义的行为,因此编译器可以执行任何它想要的操作
通常它只会溢出到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超过数据类型的最大值。