附件是查找2个数字之间所有素数的代码。 t
是测试用例的数量,n
,m
分别是上限和下限。我运行了这个程序,它一直给我sigsegv错误。
#include <iostream>
using namespace std;
int Prime1(int n,int m)
{
int i,j;
//cout<<"Enter :"<<endl;
//cin>>n;
int x[n];
for(i=0;i<=n;i++)
{
x[i]=1;
}
for(i=4;i<=n;i+=2)
{
x[i]=0;
}
for(i=3;i<=n;i+=2)
{
if(x[i])
{
for(j=2*i;j<=n;j+=i)
{
x[j]=0;
}
}
}
if(m==1)
{
m=m+1;}
for(i=m;i<=n;i++)
{
if(x[i])
{
cout<<i<<endl;;
}
}
}
int main()
{
int x,y,t;
cin>>t;
while(t!=0)
{
cin>>x>>y;
cout<<endl;
if(x>y)
{
Prime1(x,y);
}
else
{
Prime1(y,x);
}
t--;
}
system("pause");
}
答案 0 :(得分:5)
看看这些行
int x [n];
for(i=0;i<=n;i++)
你的数组大小是n,你正试图从第n + 1个元素中获取值
所以它应该是
int x [n];
for(i=0;i<n;i++)
答案 1 :(得分:1)
此处:int x[n];
您为n
整数分配内存,该内存上升到索引n-1
。但是在for循环中,最多引用索引n
,从而导致sigsegv。通常,sigsegv错误是无效内存访问的结果。
例如,如果您的数组大小为3,则只能访问x[0]
,x[1]
和x[2]
。因此,您必须分配n+1
元素或制作循环条件i<n
而不是i<=n
。这取决于您的应用程序逻辑。
答案 2 :(得分:0)
嗨,这是代码。
#include <iostream>
using namespace std;
void prime_num(int startNbr, int endNbr){
bool isPrime=true;
for ( int i = startNbr; i <= endNbr; i++) {
for ( int j = 2; j <= endNbr; j++){
if ( i!=j && i % j == 0 ){
isPrime=false;
break;
}
}
if (isPrime)
cout << i << endl;
isPrime=true;
}
}
int main(){
int startNbr, endNbr;
cout << " Enter start of the scale: ";
cin >> startNbr;
cout << " Enter end of the scale: ";
cin >> endNbr;
prime_num(startNbr, endNbr);
return 0;
}