Question

D'accord, j'essaie donc de créer un programme utilisant une boucle while pour trouver le plus grand commun diviseur de deux nombres. C'est ce que je suis venu avec. Cependant, d'après ce que je peux dire, le programme semble simplement ignorer complètement la boucle lorsque je l'exécute. (opers reste à 0, le diviseur revient toujours égal à num1). Quelqu'un peut-il aider un débutant?

/* Define variables for divisors and number of operations */

int num1, num2, divisor, opers;
opers = 0;

/* Prompt user for integers and accept input */

cout << "Please enter two integers with the smaller number first, separated by a space. ";
cout << endl;
cin >> num1 >> num2;

/* Make divisor the smaller of the two numbers */

divisor = num1;

/* While loop to calculate greatest common divisor and number of calculations */

while ( (num1 % divisor != 0 ) && ( num2 % divisor != 0 ) )
{

   divisor--;
   opers++;
}

/* Output results and number of calculations performed */

cout << "The greatest common divisor of " << num1 << " and " << num2 << " is: ";
cout << divisor << endl << "Number of operations performed: " << opers;
Était-ce utile?

La solution

Dès que l’un de ces modulo renvoie non 0, la boucle while se termine. (Ainsi, si l’une de vos entrées donne immédiatement le modulo un 0, la boucle ne sera pas entrée)

Ce que vous voulez probablement:

while ( (num1 % divisor != 0 ) || ( num2 % divisor != 0 ) )
{

   divisor--;
   opers++;
}

Ceci continue la boucle jusqu'à ce que les deux opérations modulo donnent 0.

Autres conseils

diviseur == num1 au départ, donc (num1% divisior! = 0) n'est pas vrai.

num1 == diviseur afin num1% diviseur == 0 et la condition de boucle est fausse. Vous souhaitez utiliser || au lieu de & amp; & amp; .

Vous voudrez probablement aussi utiliser un meilleur algorithme. Je pense qu'Euclid en a eu un.

Cela ne fonctionne pas car votre algorithme est faux! Pour trouver un algorithme GCD approprié, consultez ici .

Les autres utilisateurs ont un bon point. Je veux juste ajouter que depuis que vous débutez, vous devriez apprendre quelques moyens simples d’aider au débogage et à la résolution des problèmes de code. Un outil très courant que les débutants utilisent est la déclaration d’impression. Si vous ajoutez des instructions d'impression dans des zones clés, vous pourrez facilement trouver les problèmes.

cout << "Please enter two integers with the smaller number first, separated by a space. ";
cout << endl;
cin >> num1 >> num2;

/* Make divisor the smaller of the two numbers */

divisor = num1;

cout << "Checking values ..." << endl;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
cout << "divisor = " << divisor << endl;

/* While loop to calculate greatest common divisor and number of calculations */

cout << "about to start loop" << endl;
while ( (num1 % divisor != 0 ) && ( num2 % divisor != 0 ) )
{

   divisor--;
   opers++;
   cout << "In the loop and divisor = " << divisor << " and opers = " << opers << end;
}
cout << "after loop" << endl;

Vous pouvez donc créer le résultat comme vous le souhaitez, mais ceci n’est que pour montrer l’idée qui le sous-tend. J'espère que cela vous aidera lors du débogage futur. En outre, il existe des programmes de débogage bien plus avancés que cette méthode; mais cela fonctionne pour des questions simples.

num1 = diviseur:

5/5 = 1

donc ceci (num1% diviseur! = 0) est toujours égal à vrai et l'autre pas, vous n'entrerez jamais.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top