2009-10-22 3 views
0

Итак, я пытаюсь создать программу, используя цикл while, чтобы найти наибольший общий делитель двух чисел. Это то, что я придумал. Однако из того, что я могу сказать, программа просто пропускает цикл полностью, когда я запускаю его. (операторы остаются 0, делитель всегда возвращается равным num1). Кто-нибудь, кто может помочь новичкам?Почему этот цикл не работает?

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

ответ

6

Как только один из этих модулей возвращает не 0, цикл while завершается. (Так что, если какой-либо из ваших материалов сразу приводит к 0 из по модулю, то цикл не будет введен)

То, что вы, вероятно, хотите:

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

    divisor--; 
    opers++; 
} 

Это продолжается цикл, пока оба не по модулю операции приводят к 0

+0

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

+0

oooo. Напоминает мне, если электротехника 101. Нотный вход и ворота эквивалентны выходу или затвору. –

1

divisor == num1 изначально, поэтому (num1% divisior! = 0) неверно.

1

num1 == divisor так num1 % divisor == 0 и условие цикла ложно. Вы хотите использовать || вместо &&.

Возможно, вы также захотите использовать лучший алгоритм. Я думаю, что Евклид придумал один.

0

num1 = делитель:

5/5 = 1

так это (! Num1% делитель = 0) вычисляется всегда верно, а другой нет, вы никогда не войти.

1

Это не работает, потому что ваш алгоритм неверен! Для правильного алгоритма GCD см. here.

+0

Неправильно или не оптимально? – Bill

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; 

Таким образом, вы можете сделать вывод, как хотите, но это только для того, чтобы показать его идею. Надеюсь, это поможет вам в дальнейшей отладке. Кроме того, существуют действительно отладочные программы, которые намного более продвинуты, чем этот метод; но это работает для простых задач.