2015-12-17 80 views
-1
#include <stdio.h> 

int main() 
{ 
    int i, n, c, p; 

    printf("enter\n"); 
    scanf("%d", n); 
    c = find(n); 
    if (c == 1) 
    { 
     printf("no. is not prime"); 
    } 
    else 
    { 
     printf("no. is prime"); 
    } 

} 

find(int n) 
{ 
    int i = 2, p; 

    while (i < n) 
    { 
     p = n % i; 
     printf("value of p%d", p); 
     if (p == 0) 
     { 

      return 1; 
     } 
     i = i + 1; 
    } 
    return 2; 
} 

.................................... 上面的程序給我所有的輸入不是素數'輸出...也是p的值總是零,這不應該是這樣的... 請幫助...嚴重卡住...素數錯誤輸出

+2

當你編譯這段代碼時,你會得到任何警告嗎?我做 。 。 。 – davejagoda

+0

你有什麼試圖調試你的程序?你嘗試過調試器嗎?你有沒有嘗試'printf'來測試'n'的值是否等於你實際輸入的值? – lurker

+0

你需要'scanf(「%d」,&n);'來實際讀取一個值 –

回答

3

您的致電scanf()致電地址必須爲n。此外,對於小於2的數字,您的素數測試將失敗。另外,還可以將非零值返回爲true,否則返回零,以便可以直接使用if來測試該值。你應該找到一個比find更好的名字。

嘗試這樣:

#define TRUE 1 
#define FALSE 0 

int is_prime (int n) 
{ 
    int i; 

    if (n < 2) 
     return FALSE; 

    for (i = 2; i < n; i++) { 
     if (n % i == 0) { 
      return FALSE; 
     } 
    } 
    return TRUE; 
} 

int main() 
{ 
    int n; 

    printf ("enter number: "); 
    scanf ("%d", &n); 

    if (is_prime (n)) { 
     printf ("number is prime.\n"); 
    } 
    else { 
     printf("number is not prime.\n"); 
    } 

    return 0; 
} 

各種改進是可能的,但我想留接近你的代碼越好。

+0

感謝讓我認識到我的愚蠢的錯誤... –

0

這看起來像一個學生練習,所以我首先建議調試器是你的朋友。 :)

說了這麼多,你可能想要查看Sieve of Eratosthenesleverage Wikipedia以獲得一些好的測試內容的來源。

前面已經提出,有潛在的改進負荷......我會修改你的「查找」功能更清晰如下:

bool IsPrime(unsigned int n) 
    { 
     unsigned int nCounter = 2; 

     while (n % nCounter++); 

     return (nCounter > n); 
    } 

總理的不能爲負數因爲你」再問一個「TRUE/FALSE」問題,名稱和返回類型應強制執行該合同。

0

幾個問題:

  1. scanf("%d", n);應該是scanf("%d", &n); - 你需要通過地址n所以scanf可以更新它(注意,因爲n的價值風險運行時錯誤, 最可能不是有效的地址值);

  2. 從C99標準開始,不再支持對諸如find(int n) {...}之類的函數的隱式類型的支持,並且從頭開始從來都不是好習慣。你應該(和C99後來,必須)在這兩個函數提供一個類型說明符函數名以及聲明和功能定義 - int find(int n) {...};

  3. 類似2,前一個功能是稱爲功能聲明必須是可見的;完成此操作的最簡單方法是將函數的定義移到main的定義之上。如果你不想這樣做,那麼你需要在調用find之前的某處添加聲明int find(int n);

請注意,您可以通過幾種方法加速素性測試。首先,你可以跳過對偶數因素的測試;如果一個數字可以被2整除,那麼它可以被2整除,並且你已經檢查過了。其次,你不需要測試高達n - 1的所有因素;您只需要測試直至n的平方根的因子。你可以像這樣把所有的東西放在一起:

if (n < 2) 
    return 0; // zero indicates false 

if (n == 2) 
    return 1; // non-zero indicates true 

int result = n % 2; 
for (int i = 3; result && i * i <= n; i += 2) // loops as long as result 
    result = n % i;        // is non-zero, only tests 
               // against odd numbers up to 
return result;         // sqrt(n)