2017-10-20 17 views
-3

J'essaie de programmer un vérificateur de nombre premier dans c mais le code suivant renvoie certains nombres premiers comme non premiers. Je n'ai pas pu trouver de non premier qui s'enregistre comme premier. Je ne sais pas où je me suis trompé et je commence à soupçonner que ma boucle est en train de sauter des numéros.Pour sauter des numéros de boucle en 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 problèmes: votre algoritm s'arrête quand un nombre ne se divise pas, sautant les autres !! et pensez à boucler jusqu'à sqrt (nummer), vous économiserez des cycles. Il existe de nombreux doublons/questions sur la vérification des nombres premiers sur SO et codereview. Les vérifier. –

Répondre

2

Oui, il saute nombre - parce que vous avez dit à!

Si vous vérifiez 15, par exemple - ce n'est évidemment pas premier. Sur la première fois à travers la boucle, dividey est réglé sur 2. Vous pouvez ensuite effectuer cette vérification:

if (nummer%dividey==0) 

15 % 2 est 1, donc cette condition échoue et vous sautez à la partie else.

Votre part d'autre le fait:

printf("ja"); 
break; 

à savoir il affiche Ja pour dire que c'est un nombre premier et arrête de boucler, même si ce n'est pas un nombre premier et que vous n'avez pas vérifié tous les diviseurs. Si la boucle avait continué à cocher la division par 3, elle aurait réalisé que ce n'est pas premier.

+0

Et donc la solution est? –

+0

Le plus simple est de mettre un drapeau à 'false' avant votre boucle, et le mettre à vrai juste avant le' break; 'dans la branche' Nein'. Une fois que vous avez quitté la boucle, si le drapeau est toujours 'false', vous avez trouvé un nombre premier. – Steve