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

Runtime error in code (C++)

本文关键字:c++ 运行时错误 代码      更新时间:2023-10-16

我是一个c++初学者,但如果我没有花几个小时在上面,我就不会问这个问题了。

代码是关于用最有效的方法在两个数之间找到最大极限为10^9的素数。

下面的代码给我运行时错误,但我不知道为什么…帮助

#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("2n");
        n = 3;
    }
    for(long int i = n; i <= m ; i+=2){
        if(newisprime(i)){
            printf("%dn",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;
}

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
  • 是有意义的