2009-10-22 101 views
0

好的,所以我試圖用while循環創建一個程序來查找兩個數字的最大公約數。這是我想出的。但是,從我所知道的情況來看,當我運行它時,程序似乎完全跳過了循環。 (操作符保持爲0,除數總是等於num1)。任何人都可以幫助新手?這個while循環爲什麼不起作用?

/* 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

我建議您學習如何使用調試程序逐句通過代碼。 – StackedCrooked 2009-10-22 15:10:18

回答

6

只要其中一個modulo返回非0,while循環終止。 (所以,如果你的任何輸入立即在0從模成果,循環將不進入)

你可能想什麼:

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

    divisor--; 
    opers++; 
} 

這繼續循環,直到兩個模運算導致0

+0

或'!(num1%divisor == 0 && num2%divisor == 0)' – dotjoe 2009-10-22 14:08:39

+0

oooo。提醒我電氣工程101. Notted輸入和門相當於未輸出或門。 – 2009-10-22 15:48:07

1

divisor == num1最初,所以(num1%divisior!= 0)不正確。

1

num1 == divisor因此num1 % divisor == 0和循環條件是錯誤的。您想使用||而不是&&

您可能還想使用更好的算法。我認爲歐幾里德提出了一個。

0

NUM1 =除數:

5/5 = 1

所以這個(!NUM1%除數= 0),結果始終爲true和其他不,你永遠不會進入。

1

它不起作用,因爲你的算法錯了!有關正確的GCD算法,請參見here

+0

錯誤還是次優? – Bill 2009-10-22 14:54:22

1

其他用戶有一個好點。我只想補充一點,因爲你剛開始應該學習一些簡單的方法來幫助調試和發現代碼的問題。初學者使用的一個非常常見的工具是打印語句。如果您在關鍵領域添加打印語句,那麼您可以很容易地找到問題。

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; 

所以你可以做你想要的輸出,但這只是爲了顯示它背後的想法。我希望這可以幫助您在將來的調試中。此外,實際的調試程序比這種方法更先進;但這適用於簡單的問題。

相關問題