当我希望素数大于1000000时,以下素数生成器代码显示错误。为什么?

时间:2013-05-19 09:51:16

标签: c++ primes

当我想要素数大于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;
 }          

2 个答案:

答案 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)。