2014-01-27 25 views
1

我有一個函數來確定給定的數是否爲素數。我一直在試圖編寫一個函數來查找給定數字後面的下一個素數。問題是它只適用於某些數字。查找下一個素數邏輯錯誤

我幾乎給了它我最好的猜測,所以如果它寫得不好,那就是原因。

# include <stdio.h> 

int next(int); 
int is_prime(int); 

int main() 
{ 
     int num; 
     printf("Enter a number\n"); 
     scanf("%d", &num); 

printf("next prime is %d\n", next(num)); 

return 0; 

這接下來就是檢查它的首要

is_prime(int n) 
{ 
     int i, test=0; 

     for (i=2; i<=n/2; i++) 
     { 
       if(n%i==0) 
       { 
         test++; 
         break; 
       } 
     } 
     if (test==0) 
       return 1; 
     else 
       return 0; 
} 

現在函數來檢查下一個素數

int next(int x) 
{ 
     int y, i; 

     for(i=x+1; i>0; i++) 
     { 
       if(is_prime(i)==1) 
           return i; 
           break; 
     } 
} 

我不知道這是否是重要的,但一些在6,10和12, 但是7,8,13和14沒有工作的樣品。

+1

替換'用於(ⅰ= 2;我<= N/2;我++)'與'用於(ⅰ= 2; i * i <= n; i ++)''is_prime(int n)''裏面。 –

+0

爲什麼用eazars的建議,我刪除了'int next(int x)'中的中斷,並且它可以工作。 – Bradg89

+0

是的,隨着我的改變,它會更快。 :)我不是故意的,而是*的答案,對不起,我不清楚。 :) –

回答

1

你的問題是break聲明,刪除它。

int next(int x) 
{ 
    int y, i; 

    for(i=x+1; i>0; i++) 
    { 
     if(is_prime(i)==1) 
      return i; 
      break;  //delete this line 
    } 
} 

正在發生的事情是,每一個第一次測試後,你立即圈外。這就是爲什麼像6,10和12這樣的數字正在工作的原因。這是因爲緊接着的下一個數字是素數。對於其他情況下,下一個直接號碼不是素數,這是行不通的;如果沒有達到素數,它將會中斷。如果要在if分支中執行多個語句,則必須將它們包裝在{}括號中。

這是用於在如果分支的多個語句的正確形式:

if(is_prime(i)==1) 
{ 
    return i; 
    break; 
} 
+0

謝謝你做到了。 – Bradg89

+1

np,請閱讀更新,它會幫助你解決類似的問題。 – eazar001