代码中的运行时错误(C ++)

时间:2015-05-25 12:11:44

标签: c++ runtime-error

我是c ++的初学者,但如果我没有花费数小时的时间,我就不会问这个问题。

代码是以最有效的方式在两个数字之间找到素数,其中最大限制为10 ^ 9。

以下代码给出了运行时错误,但我不知道为什么.. help

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;

long int prime[32000];

bool isprime(long int a){
    for(long int i = 3; i <= 32000; i+=2){
        if(a%i == 0){
            return false;
        }
    }
    return true;
}

void generateprimes(){
    long int a = 0;
    for(long int i = 3; i < 31623 ; i+=2){
        if(isprime(i)){
            prime[a] = i;
            a++;
        }
    }
}

bool newisprime(long int a){
    long int x =0;
    for(long int i = prime[x]; i <= sqrt(a); i = prime[++x]){
        if(a%i == 0){
            return false;
        }
    }
    return true;
 }

void generateprimes_inbetween(long int n,long int m){
    if(n%2 == 0){
        ++n;
    }
    if(n == 1){
        printf("2\n");
        n = 3;
    }
    for(long int i = n; i <= m ; i+=2){
        if(newisprime(i)){
            printf("%d\n",i);
        }
    }
}

int main() {
    long int a,b,c;
    scanf("%ld",&a);
    generateprimes();
    for(long int i = 0; i < a ; i++){
        scanf("%ld %ld",&b,&c);
        generateprimes_inbetween(b,c);
        printf("\n");
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

isprime()中,您遍历数组prime[]中的所有数字。但是在启动时,由于它是全局数据,因此大多数都是0,因此a%i将导致致命的除以0.

您可以在某处跟踪存储在数组中的素数的数量,并仅针对存储在那里的素数进行测试。

假设它是作业并且你不允许使用向量,你可以按如下方式进行:

const size_t max_primes = 32000;        // avoid hard coded values 
unsigned long prime[max_primes] {2, 3}; // prefilled values
size_t nprimes = 2;                     // number of primes in the array

bool isprime(unsigned long a){
    for(size_t i = 0; i < nprimes; i++){
        if(a%prime[i] == 0)
            return false;
    }
    return true;
}
void generateprimes(){
    nprimes = 2;
    for(unsigned long i = 3; nprimes<max_primes && i < ULONG_MAX; i += 2){
        if(isprime(i)){
            prime[nprimes] = i;
            nprimes++;
        }
    }
}
bool newisprime(unsigned long a){
    size_t x = 0;
    for(unsigned long i = prime[x]; i <= sqrt(a) && x<nprimes; i = prime[++x]){
        if(a%i == 0)
            return false;
    }
    if(x == nprimes) {
        cout << "Attention: Reaching end of prime table !!" << endl;
    }
    return true;
}

一些评论:

  • 对于索引,使用无符号类型size_t更安全。
  • 确保无论何时使用索引,它都保持在范围内
  • 当您使用正数时,使用unsigned long
  • 是有意义的