2015-10-15 71 views
3

該代碼應該檢查用戶輸入的數字是否是質數。我正在執行cygwin終端上的程序,每當我運行它並輸入一個數字時,它就會顯示「Segmentation fault(核心轉儲)」。有什麼建議麼?使用遞歸查找素數

#include <stdio.h> 

int prime(int num, int i, int count); 

void main() 
{ 
    int num, i=2, count=0, result; 

    printf("Please enter a number: "); 
    scanf("%d", &num); 

    result = prime(num, i, count); 

    if (result != 0) 
     printf("num is not a prime number"); 
    else 
     printf("num is a prime number"); 
} 

int prime(int num, int i, int count) 
{ 
    if (i < num) 
    { 
     if (num%i == 0) 
     { 
      count++; 
      prime(num, i++, count); 
     } 
     else 
      prime(num, i++, count); 
    } 
    return count; 
} 
+0

小提示,如果一個數是2的倍數(即它甚至)你可以跳過它,除了2當然。 2是唯一的素數。 – Skurmedel

回答

4

你在你的函數參數使用後incrementi++。這絕對無能爲力。因爲執行後發生後增量。 所以你的i變量永遠不會增加,並使無限遞歸給你segmentation fault

您可以通過預增加++i或調用函數i+1來修復它。

int prime(int num, int i, int count) 
{ 
    if (i < num) 
    { 
     if (num%i == 0) 
     { 
      count++; 
      prime(num, ++i, count); 
     } 
     else 
      prime(num, ++i, count); 
    } 
    return count; 
} 
+1

@邁克爾,有時候愚蠢的錯誤會讓我們的生活變得艱難。 – ashiquzzaman33

+0

你在告訴我.. – Michael

+0

@Michael,請接受一個能很好地回答你問題的答案。 http://stackoverflow.com/help/someone-answers – ashiquzzaman33

2

段錯誤是特定類型的錯誤引起的內存訪問說:「不屬於你了。」這是一個讓你從損壞的內存,並引入難以調試內存錯誤的輔助機制。每當你遇到段錯誤時,你都知道你正在做的是內存錯誤 - 訪問已被釋放的變量,寫入內存的只讀部分等等。在大多數語言中,分段錯誤基本上是一樣的,內存管理,C和C++中的段錯誤之間沒有主要區別。

有許多方法可以獲得段錯誤,至少在C(++)等低級語言中。得到段錯誤的一個常見方式是取消引用空指針:

更多更好的去通過這些鏈接: What is a segmentation fault?

what is Segmentation fault (core dumped)?

+0

哦,我不知道,謝謝 – Michael

+0

鏈接對你有用... – Roushan45

+1

是啊它確實幫助我理解它 – Michael