当我想要大于1000000的质数时,下面的质数生成器代码显示了一个错误

The following prime generator code shows an error when i want prime numbers greater than 1000000.Why?

本文关键字:显示 代码 一个 错误 1000000 大于 我想要      更新时间:2023-10-16

当我想要大于1000000的素数时,下面的素数生成器代码显示了一个错误。为什么?起初,它似乎发生了b' because of int,所以我把它改成了long,但错误仍然存在....从技术上讲,如果程序运行后出现错误,则显示"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;
 }          

此代码中没有错误

代码太慢了,虽然,它几乎是二次的。在ideone上达到100万的预计时间:290秒。

修正后,通过将内部for循环条件由for(...;j<=(i/2);...)改为for(...;j<=(i/j);...),经验运行在~ n^1.45,在Ideone上运行1.27秒达到100万。

定义静态数组在这种情况下没有帮助。因为c++中不允许声明这么长的静态数组;你可以试试

int *b = new int [a];

动态声明数组大小(即数组大小将在运行时决定)。在变量'a'超过int(-2,147,483,648到2,147,483,647)的范围之前,代码应该可以工作。