Jump to content
Sign in to follow this  
JMAS

multiplos parte 2

Recommended Posts

JMAS

Este e o enunciado do exercicio, um programa que calcula e imprime no ecrã um múltiplo de num2 cuja diferença para num1, em valor absoluto, seja mínima.

Caso haja dois múltiplos de num2 a igual distância de num1, deve ser indicado o maior deles.

#include <stdio.h>

int main ( void )

{

int num1;

int num2;

int num3;

  printf( "introduza um primeiro valor positivo\n");

  scanf( "%d", &num1);

  printf( "introduza o segundo valor positivo\n");

  scanf( "%d", &num2);

  if( num1 > num2){

  for ( num3 = 1; num1 >= num2 * num3; num3++)

    printf( "%d ",num2 * num3 );

  }

  else if( num1 < num2 ){

  printf( "multiplo = 0" );

  }

  else printf( "multiplo = 1" );

 

return 0;

}

os problemas: imprime mais que um numero e nao imprime o que e preciso.

Share this post


Link to post
Share on other sites
pmg

Vamos lá a uns exemplos ...

num1 = 12; num2 = 5; output pretendido: 10 ==> 12 / 5 dá 2; entre 2*5 e 3*5 escolher o primeiro

num1 = 14; num2 = 5; output pretendido: 15 ==> 14 / 5 dá 2; entre 2*5 e 3*5 escolher o segundo

num1 = 15; num2 = 6; output pretendido: 18 ==> 15 / 6 dá 2; entre 2*6 e 3*6 escolher o segundo

... ... ...

vê lá se assim consegues fazer o programa :cheesygrin:


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
KTachyon

Estás a imprimir os valores no ciclo, é normal que te imprima vários valores menos o que pretendes. Repara que aquilo que queres irá resultar depois de teres feito o ciclo para achar o multiplicador.

Depois, achares a altura em que num3*num2 > num1 não significa que achaste o número mais próximo, tens que verificar se qual deles é mais próximo (ou o maior se estiverem a igual distância):

se num3*num2

ou

se (num3-1)*num2

Finalmente, se num1 < num2, tens duas hipóteses: ou o múltiplo é 1 ou é 0. Podes fazer uma segunda comparação:

se num1 < num2/2 -> imprime 0;

se num1 >= num2/2 -> imprime 1;

Tendo, obviamente em conta a questão dos arredondamentos de números inteiros que o computador vai fazer.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
JMAS

ok, depois de pensar um bocado resolvi dividir isto em 2 casos, quando o resto da divisao e igual e diferente de 0.

if( num1 > num2)

  divisao = num1 % num2;

    if(divisao == 0){

    printf("divisao = %d", num1 + num2);

    }

este parte e para que e igual a 0, ou seja quando a distancia entre os mais pertos inferior e superior e igual, verfica tudo para este caso.

Share this post


Link to post
Share on other sites
KTachyon

Sim, mas só para o caso em que o resto da divisão é igual a zero. Mas o múltiplo será

multiplo = num1 / num2;

Mas dessa forma podes resolver todos os casos:

multiplo = num1 / num2;   // multiplo de num2 < num1
divisao = num1 % num2;

if (num2*(multiplo+1) - num1 <= divisao) {   // multiplo de num2 > num1
    multiplo++;
}

printf("multiplo: %d\n", multiplo);


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
JMAS

dessa maneira so irei obter a divisao +1 e nao o multiplo, porque quando dividi 15 por 4 deu 3.

Share this post


Link to post
Share on other sites
KTachyon

Deve dar 4:

multiplo = 15 / 4; // multiplo = 3
divisao = 15 % 4; // (15 - 4*3 = 3) divisao = 3

if (4 * (3 + 1) - 15 <= 3) {  // if (16-15 <= 3)
  multiplo++;  // multiplo = 4
}

printf("%d\n", multiplo); // 4


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
KTachyon

Então imprimes o valor:

printf("%d\n", multiplo * num2);


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
JMAS

sim de facto funciona na totalidade, obrigado, como ainda tenho pouca pratica e nao sei pensar bem a coisa, invento um bocado e como estava a fazer nao estava mal o problema ia ser para o resto diferente de 0, mas com o tempo....

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.