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
    Olympe02

    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
    Chanur

    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.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

Discussions similaires

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