2012-01-15 81 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; 

} 
相關問題