当我想要素数大于1000000时,以下素数生成器代码显示错误。为什么? 起初它似乎发生了int的b'cuz所以我把它改成了很长但是错误仍然存在.... 从技术上讲,这是一个错误程序运行后显示消息“primegen.exe已停止工作”
#include <iostream>
using namespace std;
int main()
{
long int a,c,k,d;
k=0;
cin>>a;
cin>>d;
long int b[a];
b[a-1]=0;
for(long int i=2;i<=a;i++)
{
for(long int j=2;j<=(i/2);j++)
{
c=1;
if ( i%j!=0 )
{
continue;
}
else
{
c=0;
break;
}
}
if (c!=0)
{
b[k]=i;
//++k;
}
else b[k]=0;
++k;
}
for(long int i=d;i<a;i++)
{
if (b[i]!=0)
{
cout<<b[i]<<"\t";
}
}
cin.ignore();
cin.get();
return 0;
}
答案 0 :(得分:1)
There is no error in this code
但代码太慢了,它几乎是二次方的。 The projected time在ideone上达到1百万:290秒。
修复它之后,通过将内部for
循环条件从for(...;j<=(i/2);...)
更改为for(...;j<=(i/j);...)
,它在经验上以~n ^ 1.45运行,并在1.27秒内达到1毫升Ideone。
答案 1 :(得分:0)
在这种情况下,定义静态数组无济于事。因为你不允许在C ++中声明这么长的静态数组; 您可能想尝试
int *b = new int [a];
动态声明数组大小(即数组大小将在运行时决定)。代码应该有效,直到变量'a'超出int的范围(-2,147,483,648到2,147,483,647)。