Por que isto não enquanto o trabalho loop?
-
05-07-2019 - |
Pergunta
Ok, então eu estou tentando criar um programa usando um loop while para encontrar o máximo divisor comum de dois números. Isto é o que eu vim acima com. No entanto, desde que eu posso dizer, o programa só parece ignorar o circuito totalmente quando eu executá-lo. (Opers restos 0, divisor sempre volta igual a num1). Qualquer um lá fora, que pode ajudar um novato?
/* 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;
Solução
Assim que um desses modulo retornos não 0, o tempo termina de loop. (Portanto, se qualquer um dos seus inputs resulta imediatamente em 0 do módulo, o loop não será inserido)
O que você provavelmente quer:
while ( (num1 % divisor != 0 ) || ( num2 % divisor != 0 ) )
{
divisor--;
opers++;
}
Este continua o loop até que ambas as operações modulo resultar em 0.
Outras dicas
divisor == num1 inicialmente, então (num1% divisior! = 0) não é verdade.
num1 == divisor
tão num1 % divisor == 0
ea condição do loop é falsa. Você quer usar ||
vez de &&
.
Você provavelmente também querem usar um algoritmo de melhor. Eu acho que Euclides veio com um.
Não funciona porque o seu algoritmo é errado! Para um algoritmo GCD adequada, consulte aqui .
Os outros usuários têm um bom ponto. Eu só quero acrescentar que, desde que você está começando você deve aprender algumas maneiras simples para ajudar a depurar e encontrar problemas com seu código. Um muito comum o uso iniciantes ferramenta é instruções de impressão. Se você adicionar instruções de impressão em áreas-chave, então você pode encontrar os problemas muito facilmente.
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;
Assim que você poderia fazer a saída como quiser, mas isso é apenas para mostrar a idéia por trás dele. Espero que isso ajude você no futuro depuração. Além disso, existem programas de depuração reais que são muito mais avançado do que este método; mas isso funciona para isssues simples.
num1 = divisor:
5/5 = 1
de modo que este (num1% divisor! = 0) avalia sempre a verdade e o outro não, você nunca vai entrar.