Deux algorithmes que je ne comprends pas C++
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Deux algorithmes que je ne comprends pas C++



  1. #1
    invite21b4790f

    Deux algorithmes que je ne comprends pas C++


    ------

    Bonsoir tout le monde

    Il y'a deux algorithmes que je ne comprends pas Je l'ai fais en cours après il y'avait eu la correction
    Pouvez-vous m'expliquer svp ?

    Je sais qu'un nombre est dit premier si ses deux seuls diviseurs entiers positifs sont 1 ou lui-même.
    Voici les algorithmes (j'ai mis des commentaires)
    Code:
    #include <iostream>
    using namespace std;
    main()
    {
    
    int nombre = 0;
    int n = 0;
    int diviseur = 0;
    
    cout << "--- Calcul de nombres premiers ---\n";
    cout << "Combien souhaitez vous en calculer: ";
    cin >> nombre;
    
    do
    {
    
    n++; // est ce que c'est l'équivalent de n=n+1 et pourquoi on fait cela ? 
    
    //ici aussi je n'ai pas compris du tout 
    for(diviseur = 2; diviseur < n; diviseur++)
    
    if(!(n%diviseur)) break;
    
    if(diviseur == n)
    {
    
    nombre--;
    cout << "Trouvé : " << n << endl;
    
    }
    
    } while(nombre);
    
    cout << "Fini!\n";
    
    }
    Code:
    #include<iostream>
    using namespace std;
     
    int main()
    {
        int N, i=1, nb=0, d;
        bool est_premier;
     
        cout<<"Tapez la valeur de N : "; cin>>N;
     
        while(nb<N)
        {
            i++;
            est_premier=true;
            d=2;
            while(est_premier && d*d<=i)
                if(i%d==0)est_premier=false; else d++;
     
            if(est_premier==true) nb++;
        }
     
        cout<<"Le N-ième nombre premier est "<<i<<endl;
     
        return 0;
    }
    Merci d'avance
    Bonne soirée

    -----

  2. #2
    invite1c6b0acc

    Re : Deux algorithmes que je ne comprends pas C++

    Bonjour,

    Le premier programme serait plus lisible s'il était indenté comme le deuxième, tu ne penses pas ?
    Le premier programme donne la liste des n premiers nombres premiers ; le deuxième donne le nième nombre premier

    n++ est strictement équivalent à n = n+1
    Je ne suis pas sûr de comprendre la question "pourquoi on fait cela ?"
    Si tu veux dire "pourquoi utiliser n++ plutôt que n=n+1", il n'y a pas de réponse très précise : parce que c'est plus court, parce que ça correspond à une instruction de la machine, par habitude ...
    Si tu veux dire "pourquoi incrémenter n", c'est parce que n est le nombre qu'on va tester pour savoir s'il est premier. On va l'incrémenter tant qu'on n'a pas trouvé autant de nombres premiers que demandé.

    Code:
    //ici aussi je n'ai pas compris du tout
    for(diviseur = 2; diviseur < n; diviseur++)
        if(!(n%diviseur)) break;
    (Je suppose que tu connais la syntaxe de la boucle "for")
    Là on regarde si n est premier : "diviseur" va prendre successivement toutes les valeurs de 2 à n-1, en testant à chaque fois si n%diviseur est nul, c'est à dire si "diviseur" est un diviseur de n. Si c'est le cas, le "break" interrompt la boucle.
    Si aucune des valeurs de "diviseur" n'est un diviseur de n, la boucle s’arrête quand la condition diviseur < n devient fausse, c'est à dire que "diviseur" est égal à n.
    Si on a trouvé un diviseur, la boucle s'arrête sur le break et "diviseur" est inférieur à n

    D'où le test suivant : "if (diviseur == n)" qui ne sera donc vrai que si n n'a pas d'autre diviseur que 1 et n
    Si c'est le cas, on affiche la valeur de n, et on décrémente "nombre" qui est le nombre de nombres premiers qu'il reste à trouver.

    Ensuite si nombre n'a pas encore atteint 0, on boucle, on incrémente n et on essaie le nombre suivant.


    Le deuxième programme est quasiment le même avec :
    "i" à la place de "n"
    "d" à la place de "diviseur"
    On clarifie les choses en utilisant le booléen "est_premier", plus clair que précédemment le test "diviseur == n"
    On s'arrête quand d*d < i, ce qui économise du temps (inutile de chercher après ).
    Contrairement au premier programme, le deuxième n'affiche que le dernier nombre premier trouvé, donc on se contente d'incrémenter "nb" à chaque fois qu'on en trouve un, et on boucle tant que "nb" est inférieur à "N"


    J'ai l'impression que mes explications sont assez confuses . N'hésite pas à demander des éclaircissements.

  • Discussions similaires

    1. algorithmes
      Par invite4a863132 dans le forum Programmation et langages, Algorithmique
      Réponses: 2
      Dernier message: 23/01/2012, 10h52
    2. Algorithmes
      Par invite40c2a12f dans le forum Mathématiques du collège et du lycée
      Réponses: 2
      Dernier message: 15/11/2011, 19h18
    3. Algorithmes
      Par invited3379a2d dans le forum Mathématiques du supérieur
      Réponses: 4
      Dernier message: 30/08/2010, 19h20
    4. les algorithmes de Tri
      Par inviteddeac092 dans le forum Logiciel - Software - Open Source
      Réponses: 14
      Dernier message: 21/11/2009, 17h07
    5. les algorithmes de Tri
      Par inviteddeac092 dans le forum Technologies
      Réponses: 1
      Dernier message: 15/11/2009, 15h42