2016-03-31 82 views
0

我是初學者,正在學習函數。以下是我寫的代碼,以查找給定的數字是否爲素數。但是,當我執行它時,我會看到對話框顯示「project.exe已停止工作」。我正在使用dev C++。我的代碼有問題嗎?查找給定數字是否爲素數的函數

#include<stdio.h> 
int prime (int i); 
int main() 
{ 
    int a,b; 
    scanf("%d",&a); 
    b=prime(a); 
    if (b==1) 
    printf("prime"); 
    else 
    printf("not prime"); 
    return 0; 
} 
int prime (int i) 
{ 
    int j=0; 
    for (j=0;j<=i;j++) 
    { 
     if (i%j==0) 
     break; 
    } 
    if (j==i) 
    return 1; 
    else 
    return 0; 
} 
+2

第一次通過'j'循環時,'j'爲零。你不能以零分或取其餘部分。以'j = 2'開始循環,因爲除以1的餘數總是零。同樣對於上限:當'i == j'時'i%j'爲零。畢竟,素數可以被一個整除。 –

+0

此外,如果您的終止條件是'j <= i',如果您在整個循環中運行而不會中斷''j'',那麼它將不等於'i'。最好立即返回0而不是跳出循環。 –

+0

您應該將函數更改爲'bool prime(int i)'並返回'true'或'false'。命名它'is_prime'可能也是一個好主意,表明它有一個布爾結果。 – Lundin

回答

1

更改您的首要功能,這個代碼塊:

int j=0; 
    for (j=0;j<=i;j++) 
    { 
     if (i%j==0) 
     break; 
    } 

到:

int j; 
    for (j=2;j<=i;j++) 
    { 
     if (i%j==0) 
     break; 
    } 

當你試圖找到它實際上是試圖通過除法運算找到它的mod。您不能將數字除以零,因爲j最初爲零,您的程序正在崩潰。

+0

'j = 1'也是錯誤的 –

+0

我不是在談論主要發現算法的效率。我只是建議解決編程崩潰的問題。順便說一句,我編輯了答案。 – Imran

+0

已撤銷Downvote。這也將確保1和更小的數字不被標記爲素數。 'j <= i' can'j

1

它應該從2開始,而不是從0開始。 0導致除以零,這就是爲什麼你的程序停止。正確的是:

int j; 
for (j=2;j<i;j++) 
{ 
    if (i%j==0) 
    break; 
} 
if (j==i) 
    return 1; 
else 
    return 0; 
// or simply return j == i; 
+0

我不需要把j <= i?如果結束條件是j Vamshi

+1

@Vamshi:是的。但是你不想測試數字的可分性,因爲測試會成功,你會錯誤地將素數標記爲非素數。 –

0

您需要返回一個不是一個的值。像這樣...

int prime (int i) { 
    int j; 

    if (i <=3) return 1; 
    for (j=2;j<i/2;j++) 
     if (i%j==0) return j; 

    return 1; 
} 

檢查數字i是否大於3也很重要。

+0

他只是試圖編寫一個給出布爾結果的函數:是素數?對或錯。他只是使用int而不是bool,原因不明。 – Lundin

+0

我認爲他在使用C,最初沒有布爾。 C++出來後,我認爲每個人都習慣在bool中思考。 – ssm