2012-01-15 55 views
1

附加的是查找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

你应该看看埃拉托色尼的筛子:http://stackoverflow.com/a/24185190/205521的 – 2014-06-12 13:15:50

+0

可能重复[如何找到0之间的素数 - 100?( http://stackoverflow.com/questions/11966520/how-to-find-prime-numbers-between-0-100) – 2014-06-12 13:20:11

回答

5

看看这些线

INT X [N];

for(i=0;i<=n;i++) 

您的数组大小为n,你想从N + 1个元素

所以价值应该是

INT X [N];

for(i=0;i<n;i++) 
1

这里:int x[n];

您的n整数,它上升到指数n-1分配内存。但是,在你的for循环中,你引用索引n,从而导致sigsegv。一般来说,sigsegv错误是内存访问无效的结果。

例如,如果您的阵列大小为3,则只能访问x[0],x[1]x[2]。因此,您必须分配n+1元素或使循环条件为i<n而不是i<=n。这将取决于您的应用程序逻辑。

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; 

}