Comparer deux nombres

Résolu
alexey27 Messages postés 18 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 11 janvier 2009 - 22 nov. 2008 à 19:33
alexey27 Messages postés 18 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 11 janvier 2009 - 27 nov. 2008 à 15:41
Bonsoir je debute en C++ donc j'aurai besoin d'un peu d'aide au niveau d'un programme que je dois faire.
Le programme doit demander a l'utilisateur d'entrer deux nombres, puis celui-ci doit affciher le nombre de chiffres communs a ces deux nombres.
Par exemple pour 1789 et 17 le programme affichera 2.
Or je ne sais pas comment m'y prendre pour decomposer les nombres en chiffres, je ne doit pas utiliser les chaines de caracteres  car je me l'ai pas encore appris.

Si quelqu'un sait comment s'y prendre ?
Merci d'avamce .

12 réponses

alexey27 Messages postés 18 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 11 janvier 2009 1
24 nov. 2008 à 18:13
Merci pour la reponse. J'ai a peu pres compris la methode mais le modulo corespond a quoi exactement ?
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
24 nov. 2008 à 18:49
Salut
Le modulo est le reste de la division Euclidienne: 1789%10 te donnera 9.

A+
________________________________________________________________________________
Mon site internet :   http://ImAnalyse.free.Fr
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
24 nov. 2008 à 18:57
Exemple pas à pas avec une variable :
variable = 193 (type entier)
193 modulo 10 = 3 -> tu récupères le 3
193 divisé par 10 = 179 (puisque c'est du type entier)
19 modulo 10 = 9 -> tu récupères le 9
19 divisé par 10 = 1
1 modulo 10 = 1 -> tu récupères le 1
1 / 10 = 0
variable = 0 -> fin des tests

On note que tu as pu anayler ton nombre (179) chiffre par chiffre (3, 9 puis 1), donc il suffit de faire pareil avec ton 2ème nombre, en les comparant chiffre à chiffre : une boucle suffit, en s'arrêtant quand l'un des 2 nombres est égal à 0.
Allez, tu as tout, là.
Bon codage :)

Cordialement, uaip.
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
24 nov. 2008 à 18:59
Oups, je me suis mal relu
"193 divisé par 10 = 19 (puisque c'est du type entier)"
et
"On note que tu as pu anayler ton nombre (193) chiffre par chiffre (3, 9 puis 1)"
Désolé pour le double posting...

Cordialement, uaip.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
alexey27 Messages postés 18 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 11 janvier 2009 1
24 nov. 2008 à 19:09
Merci beaucoup a toi !!! Bravo pour la technique.
++
0
alexey27 Messages postés 18 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 11 janvier 2009 1
26 nov. 2008 à 19:43
Excusez moi de solliciter encore votre aide mais voici ce que j'ai fait:

#include
 
using std::cout;
using std::cin;
using std::endl;
 
int main ()
{
    int num1,num2,a,b;
 int nbr=0;
 
    cout<<"num1"<<endl;
    cin>>num1;
    cout<<"num2"<<endl;
    cin>>num2;
 




     while (a!=0)
  {
   a=num1%10;
      num1=num1/10;


      while (b!=0)
   {
    b=num2%10;
       num2=num2/10;


  


    if (a==b)
    {
     nbr++;
        break;
    }
   }
  }
   
  


   cout<<nbr<<endl;
   b=-1;
  


  
  
  
 
  
  
 
 return 0;
}
  


Le programme doit comparer les chiffres du nombre 1 avec les chiffres du nombre 2.


Le probleme est que mon programme ne fonctionne pas correctement, j'ai beau le retourner dans tous les sens je ne trouve pas le probleme. Si quelqu'un peut m'aider?


Merci
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
26 nov. 2008 à 20:52
Dès ton premier passage dans la deuxième boucle, tu divises num2 jusqu'à obtenir 0.
Ce qui fait qu'en arrivant au deuxième passage (donc 2ème chiffre de num1), num2 vaudra forcément 0.
Garde num1 et num2 à part. Copie les dans d'autres variables que tu pourras diviser sans détériorer les nombres de départ.

Ah et aussi, ton algo n'est pas bon.
Tu as dit que tu voulais savoir combien il y avait de chiffres communs entre 2 nombres. Donc logiquement, vu qu'il n'y a que 10 chiffres, il ne peut pas y avoir plus de 10 chiffres communs.Or toi tu compares chaque chiffre de num1 avec chaque chiffre de num2. Donc en gros si num1 num2 12345678901234567890 tu obtiendras 20.

PS : Fais aussi un effort sur l'indentation, c'est pas trop lisible, là
Et
using std::cout;
using std::cin;
using std::endl;
Tu peux le résumer en ceci : using namespace std;

Cordialement, uaip.
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
26 nov. 2008 à 21:10
J'ai oublié de préciser une autre erreur de ton algo.
Dans tes boucles, ce n'est pas le chiffre récupéré qu'il faut vérifier (a ou b) mais le restant du nombre.
J'ai refait l'exo, ça marche chez moi.
Si je ne me suis pas trompé (par rapport au post précédent), n'hésite pas
Si j'ai bien compris, "22" et "2" retourne 1 (et non 2 avec ton algo).
Bonne chance.

Cordialement, uaip.
0
alexey27 Messages postés 18 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 11 janvier 2009 1
27 nov. 2008 à 01:34
Deja merci pour les conseils! Le but de l'exercice est  justement  de comparer chaque chiffre de num1 avec les chiffres de num2.
Cependant lorsqu'un chiffre de num1 apparait plusieurs fois dans num2, on ne doit le compter qu'une fois:
Par exemple pour num1=444 et num2=34 on obtiendra 3.
                           num1=135 num2=55003 on obtiendra 2.
C'est pour ca que j'ai procede ainsi!

J'ai compris tout ce que tu m'as dit sauf une chose:
Pourquoi faut il verifier le restant le restant du nombre et pas le chiffre recupere (a ou b) ?

Ps: Le prof ne veut pas que l'on utilise:  using namespace std; .
0
alexey27 Messages postés 18 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 11 janvier 2009 1
27 nov. 2008 à 15:41
J'ai tres bien compris ton post merci beaucoup pour les explication. Je vais reessayer, j'espere que ca va marcher!
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
24 nov. 2008 à 13:44
Je ne vais pas te faire le code, mais voilà la méthode :
- modulo 10 de chacun de tes nombres pour récupérer un seul chiffre
- comparaison des 2 modulos, si égal, tu incrémentes une variable
- tu divise tes nombres par 10
- tu boucles tout ça jusqu'à ce que l'un de tes nombres ne soit égal à 0

Cordialement, uaip.
-1
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
27 nov. 2008 à 13:21
Ok, ce que tu dis dans ton commentaire, c'est exactement ce que je t'ai dit.
C'est justement parce-que ton algo compte même les chiffres qui apparaissent plusieurs fois qu'il est faux.

Ensuite, dans tes boucles, tu vérifies les restes (a != 0) ou (b != 0)
Or c'est faux.
Tu n'as pas bien saisi ma méthode... En calculant le modulo d'un nombre, tu obtiens seulement le restant de la division euclidienne. Par exemple :9 / 2 4 et il reste 1. Donc 9 % 2 1.
Or comme je t'ai dit, le modulo par 10 ici te retourne à chaque fois le chiffre de droite (les unités). Par exemple, 123 % 10 = 3.Mais imagines que ton nombre soit 200. Alors 200 % 10 0. Dans ton code, a 0 donc la boucle s'arrête. Et du coup tu zappes les 2 autres chiffres (2 et 0).
il faut donc que tu prennes le modulo de tes nombre, ce qui te retourne 1 chiffre, tu les compares, et une fois que c'est bon, tu divises tes nombres par 10 pour passer au chiffre suivant. Et c'est ça qu'il faut vérifier dans ta boucle. Car au bout d'un moment, à force de diviser par 10, ton nombre va être égal à 0, et alors là tu pourras arrêter de boucler (sinon tu boucles à l'infini).
Relis mon ancien post o^j'expliquais la démarche pas à pas, il était parfaitement clair ^^

Ensuite, concernant l'erreur de comparer plusieurs fois le même chiffre. Je ne sais pas si c'est la meilleure solution mais en tout cas elle fonctionne et est très simple. Je m'explique :
Initialise un tableau de booléens en début de code, contenant 10 cases, et met les toutes à zéro par exemple.
Et chaque fois que 2 chiffres sont semblables, tu mets la case du chiffre correspondant à 1. Comme ça tu vérifies : si la case est déjà à 1, alors le chiffre a déjà été compté

Schéma du tableau de booléens :
case 0 | case 1 | case 2 | case 3 | case 4 | case 5 | case 6 | case 7 | case 8 | case 9Lorsque a b, tu mets ton tableau[a] à 1. Donc si a b = 3, c'est la quatrième case qui sera mise à 1.

... je ne sais pas si je suis compréhensible

Mais relis quand même mon commentaire expliquant la démarche pas à pas (pour le modulo).

Cordialement, uaip.
-2
Rejoignez-nous