Comparer deux nombres [Résolu]

alexey27
Messages postés
18
Date d'inscription
samedi 22 novembre 2008
Dernière intervention
11 janvier 2009
- 22 nov. 2008 à 19:33 - Dernière réponse : alexey27
Messages postés
18
Date d'inscription
samedi 22 novembre 2008
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 .
Afficher la suite 

Votre réponse

12 réponses

uaip
Messages postés
1470
Date d'inscription
mardi 20 février 2007
Dernière intervention
7 février 2011
- 24 nov. 2008 à 13:44
0
Merci
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.
Commenter la réponse de uaip
alexey27
Messages postés
18
Date d'inscription
samedi 22 novembre 2008
Dernière intervention
11 janvier 2009
- 24 nov. 2008 à 18:13
0
Merci
Merci pour la reponse. J'ai a peu pres compris la methode mais le modulo corespond a quoi exactement ?
Commenter la réponse de alexey27
Pistol_Pete
Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Dernière intervention
9 juillet 2013
- 24 nov. 2008 à 18:49
0
Merci
Salut
Le modulo est le reste de la division Euclidienne: 1789%10 te donnera 9.

A+
________________________________________________________________________________
Mon site internet :   http://ImAnalyse.free.Fr
Commenter la réponse de Pistol_Pete
uaip
Messages postés
1470
Date d'inscription
mardi 20 février 2007
Dernière intervention
7 février 2011
- 24 nov. 2008 à 18:57
0
Merci
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.
Commenter la réponse de uaip
uaip
Messages postés
1470
Date d'inscription
mardi 20 février 2007
Dernière intervention
7 février 2011
- 24 nov. 2008 à 18:59
0
Merci
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.
Commenter la réponse de uaip
alexey27
Messages postés
18
Date d'inscription
samedi 22 novembre 2008
Dernière intervention
11 janvier 2009
- 24 nov. 2008 à 19:09
0
Merci
Merci beaucoup a toi !!! Bravo pour la technique.
++
Commenter la réponse de alexey27
alexey27
Messages postés
18
Date d'inscription
samedi 22 novembre 2008
Dernière intervention
11 janvier 2009
- 26 nov. 2008 à 19:43
0
Merci
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
Commenter la réponse de alexey27
uaip
Messages postés
1470
Date d'inscription
mardi 20 février 2007
Dernière intervention
7 février 2011
- 26 nov. 2008 à 20:52
0
Merci
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.
Commenter la réponse de uaip
uaip
Messages postés
1470
Date d'inscription
mardi 20 février 2007
Dernière intervention
7 février 2011
- 26 nov. 2008 à 21:10
0
Merci
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.
Commenter la réponse de uaip
alexey27
Messages postés
18
Date d'inscription
samedi 22 novembre 2008
Dernière intervention
11 janvier 2009
- 27 nov. 2008 à 01:34
0
Merci
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; .
Commenter la réponse de alexey27
alexey27
Messages postés
18
Date d'inscription
samedi 22 novembre 2008
Dernière intervention
11 janvier 2009
- 27 nov. 2008 à 15:41
0
Merci
J'ai tres bien compris ton post merci beaucoup pour les explication. Je vais reessayer, j'espere que ca va marcher!
Commenter la réponse de alexey27
uaip
Messages postés
1470
Date d'inscription
mardi 20 février 2007
Dernière intervention
7 février 2011
- 27 nov. 2008 à 13:21
-2
Merci
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.
Commenter la réponse de uaip

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.