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;
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top