2017-10-20 5 views
-3

私はcで素数チェッカーをプログラムしようとしていますが、次のコードはいくつかの素数を非素数として返します。私はプライムとして登録している非プライムを見つけることができませんでした。私はどこが間違っているのかわからず、私のforループが数字を飛ばしていると思われ始めています。Cのループスキップ数のために

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int nummer = 47203; 
    printf("Ist %d eine Primzahl?\n", nummer); 
    int dividey =2; 
    if (nummer == 2){ 
     printf("nein"); 

    }  


    for (dividey = 2; dividey <= nummer/2; dividey++){ 
    if (nummer%dividey==0){ 
     printf("nein"); 
     break; 
    }else { 
     printf("ja"); 
     break; 
    } 
    } 
} 
+4

2つの問題:1つの数字が分割されず、他の数字をスキップすると、アルゴリズムが停止します。 sqrt(nummer)までループすることを考慮すると、サイクルを節約できます。 SOとcodereviewについての素数チェックに関する多数の重複/疑問があります。それらを確認してください。 –

答えて

2

はい、あなたが言ったので、数字をスキップしています。

たとえば、15をチェックしていた場合、これは明らかにプライムではありません。

if (nummer%dividey==0) 

15 % 2が1であるので、この条件は失敗し、else部分にジャンプ:あなたの最初のループでは、divideyは、あなたは、このチェックを行う2に設定されています。

あなたの他の部分は、この処理を行います。

printf("ja"); 
break; 

すなわち、それは素数ではなく、すべての除数をチェックしていないにもかかわらず、素数でありループを止めると言ってJaを印刷します。ループが3で割り切っているかどうかチェックし続けていれば、それは素数ではないことに気づいたでしょう。

+0

それで、修正点は? –

+0

最も簡単な方法は、ループの前にフラグを 'false'に設定し、' Nein'ブランチの 'break;'の直前にtrueに設定することです。一度ループから脱落したら、フラグが 'false'のままであれば、素数を見つけました。 – Steve

関連する問題