2009-10-22 5 views
0

Ok, donc j'essaye de créer un programme utilisant une boucle while pour trouver le plus grand commun diviseur de deux nombres. C'est ce que j'ai trouvé. Cependant, d'après ce que je peux dire, le programme semble juste sauter la boucle entièrement quand je l'exécute. (opers reste 0, le diviseur revient toujours égal à num1). Quelqu'un là-bas qui peut aider un débutant?Pourquoi cette boucle while ne fonctionne-t-elle pas?

/* 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; 
+3

Je vous recommande d'apprendre à parcourir le code à l'aide d'un débogueur. – StackedCrooked

Répondre

6

Dès que l'un de ces modulo renvoie non 0, la boucle while se termine. (Donc, si l'un de vos entrées immédiatement 0 résultats du modulo, la boucle ne sera pas entré)

ce que vous voulez sans doute:

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

    divisor--; 
    opers++; 
} 

Cela continue la boucle jusqu'à ce que les modulo opérations aboutissent à 0

+0

ou '! (Num1% divisor == 0 && num2% divisor == 0)' – dotjoe

+0

oooo. Me rappelle si Génie électrique 101. L'entrée et la porte notées sont équivalentes à la sortie notée ou à la porte. –

1

divisor == num1 initialement, donc (num1% divisior! = 0) n'est pas vrai.

1

num1 == divisor donc num1 % divisor == 0 et la condition de boucle est fausse. Vous voulez utiliser || au lieu de &&.

Vous voudrez probablement utiliser un meilleur algorithme. Je pense qu'Euclide en a trouvé un.

0

num1 = diviseur:

5/5 = 1

donc ce (! Num1% = 0 diviseur) est toujours vraie et l'autre n'a pas, vous ne serez jamais entrer.

1

Cela ne fonctionne pas parce que votre algorithme est faux! Pour un algorithme GCD approprié, voir here.

+0

Mauvais ou sous-optimal? – Bill

1

Les autres utilisateurs ont un bon point. Je veux juste ajouter que depuis que vous commencez, vous devriez apprendre quelques moyens simples pour aider au débogage et trouver des problèmes avec votre code. Un outil très commun utilisé par les débutants est les instructions print. Si vous ajoutez des instructions d'impression dans des zones clés, vous pouvez 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; 

Donc vous pouvez faire la sortie comme vous voulez mais c'est juste pour montrer l'idée derrière. J'espère que cela vous aidera dans le débogage futur. En outre, il existe des programmes de débogage qui sont beaucoup plus avancés que cette méthode; mais cela fonctionne pour des problèmes simples.

Questions connexes