Почему не работает цикл while? - PullRequest
0 голосов
/ 22 октября 2009

Хорошо, поэтому я пытаюсь создать программу, используя цикл 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;

Ответы [ 6 ]

6 голосов
/ 22 октября 2009

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

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

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

   divisor--;
   opers++;
}

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

1 голос
/ 22 октября 2009

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

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;

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

1 голос
/ 22 октября 2009

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

1 голос
/ 22 октября 2009

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

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

1 голос
/ 22 октября 2009

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

0 голосов
/ 22 октября 2009

num1 = делитель:

5/5 = 1

так что этот (num1% делитель! = 0) всегда принимает значение true, а другой нет, вы никогда не войдете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...