-1
我是一个初学者,但我不会问这个问题,如果我没有花费几个小时。运行时错误代码(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("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;
}
你确实是知道数组的索引限制?由于索引基于零,所以'32000'元素的数组将具有从'0'到'31999'(含)的索引。你可能至少有一次出界。 –
另外,学习使用调试器,因为如果你在调试器中运行你的程序,它将停在崩溃位置,让你检查函数调用堆栈以及相关变量的值。 –
导致错误的输入是什么?通过输入随机值,我在'newisprime()','a%i'处得到了一个除以0的错误。 – emlai