Jump to content
Dexter's Lab

Saber resultado exato

Recommended Posts

Dexter's Lab

Pessoal, deparei-me com o seguinte problema:

66) Faca um programa que leia 2 numeros inteiros da entrada e imprima o resto da divisao inteira do primeiro pelo segundo, utilizando o

metodo de subtrações sucessivas. Exemplo:

Valores lidos: 15 4

Saída do programa: 3

Dica: 15 % 4 = 15 - 4 - 4 - 4 = 3

Já o completei. A minha dúvida é no programa seguinte:

67) Altere o programa do exercicio anterior para que, caso a divisao nao seja exata, o usuario seja informado.

Como posso verificar se o valor não é inteiro?

Sinto-me completamente desarmado, agora.

Aquilo que me vem à cabeça é promover a variável a float e ver o módulo, mas não é possível ver o módulo com o tipo de dados float. Não estou a ver como posso conseguir essa informação.

Qualquer ajuda é bem-vinda.

Share this post


Link to post
Share on other sites
HappyHippyHippo

estás longe da solução

um valor exacto de uma divisão inteira é somente verificar se o seu resultado é o resultado verdadeiro em |R:

exemplos :

24/3 = 8 => divisão exacta

27/5 = 5 => divisão não é exacta porque o resultado não é propriamente 5 ...

agora, para saber isto não necessitas de converter nada ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Pois, mas o C automaticamente arredonda o valor se ele for inteiro. A minha questão é essa, como posso identificá-lo em C como |R sem o promover?

Share this post


Link to post
Share on other sites
pmg

Se a divisão for exacta, qual é o resto da divisão?

Sempre que o resto da divisão for <o número que disseste para a pergunta anterior>, a divisão é exacta?

Eu digo que SIM, mas prova isso antes de escreveres o programa.


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
Dexter's Lab

Acabei por perceber que o meu algoritmo para encontrar o modulo através de subtrações está incorreto. Fiz como condição de paragem para o ciclo for chegar até ao numero de repetições que tem o 2º valor. Dava no exemplo que eles deram mas não dava noutros.

Enfim, estou farto de procurar, ninguém me pode dizer o algoritmo matemático ou o padrão que me pode fazer chegar ao resultado do módulo através de subtrações?

Share this post


Link to post
Share on other sites
pmg

Valores lidos: 15 4

Saída do programa: 3 (divisao nao exacta)

Dica: 15 % 4 = 15 - 4 - 4 - 4 = 3


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
Dexter's Lab

void MODULO_(int *a, int *b)
{
  int cont;

while (*a != *a%*b) {
 *a -= *b;
}
}

Fiz desta forma, mas a minha intenção era nunca usar o % no programa.

Edited by Dexter's Lab

Share this post


Link to post
Share on other sites
HappyHippyHippo

responde a esta questão :

se tens

15 % 4 = 15 - 4 - 4 - 4

porque razão não é :

15 % 4 = 15 - 4 - 4 - 4 - 4 - 4 - 4 - 4

ou

15 % 4 = 15 - 4 - 4

???


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
thoga31

15 % 4 = 3 não é exacto, mas 20 % 5 é. Porquê? Explicação:

1º: 15 % 4 = 15 - 4 - 4 - 4 = 3 => Resultado = 3

2º: 20 % 4 = 20 - 4 - 4 - 4 - 4 - 4 = 0 => Resultado = 5

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
HappyHippyHippo

Porque a nenhum deles corresponde o resto da divisão verdadeiro entre 15 e 4.

isso não é resposta que se apresente, demonstra porque razão não é o resultado da divisão através do algoritmo de subtracções sucessivas


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Então: 15 % 4 = 15 - 4 - 4 - 4 = 15 - 12 = 3

E: 15 % 4 = 15 - 4 - 4 - 4 - 4 - 4 - 4 - 4 = 15 - 28 = -13

E: 15 % 4 = 15 - 4 - 4 = 15 - 8 = 7

HHHippo, não sei se é aqui que queres chegar, mas são resultados diferentes.

Share this post


Link to post
Share on other sites
pmg

Quantos 4's tens que subtrair até o valor dar negativo?

Qual é o valor das subtracções imediatamente antes do valor negativo?

15 - 4 - <QUANTOS?> - 4 dá o primeiro negativo

16 - 4 - <QUANTOS?> - 4 dá o primeiro negativo

17 - 4 - <QUANTOS?> - 4 dá o primeiro negativo

765433 - 4 - <QUANTOS?> - 4 dá o primeiro negativo


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
Dexter's Lab

Segundo estou a perceber, o módulo é portanto o mais baixo valor possível em |R na subtração do segundo número sucessivamente a partir do primeiro. Se contudo o último valor for zero então é um valor exato. Percebi bem?

Share this post


Link to post
Share on other sites
Dexter's Lab

Estava aqui a pensar, será que pode ser: valor1 a dividir pelo valor dois e o resultado será o numero de vezes que vai subtrair?

Share this post


Link to post
Share on other sites
HappyHippyHippo

tens 7 berlindes, são duros como calhaus logo não os podes partir.

tens de dividir os berlindes pelo João, Maria e Rita.

para ser justo começas a dar 1 a cada um, sucessivamente até não teres nenhum.

primeiro dar uma 1 cada, ficando cada um com 1 e tu ficas com 4

uma segunda volta, voltas a dar 1 berlinde a cada um. ficas agora com 1 e cada um com 2.

mas agora não podes dividir o berlinde restante pelos três, e decides ficar com ele.

isto é a divisão inteira e aprendesse na primária !!!

em cada ciclo tu deste 3 berlindes, o que resulta nos seguintes valores

ronda | tu | Joao | Maria | Rita
----------------------------------
  0   |  7 |  0   |   0   |   0
  1   |  4 |  1   |   1   |   1      (7 - 3 dados = 4)
  2   |  1 |  2   |   2   |   2      (4 - 3 dados = 1)
----------------------------------

o que tens é então :

7 / 3 = 7 - 3 - 3 = 2 (resto 1)

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Talvez não fosse isto o que vocês queriam, mas acabei por criar uma fórmula matemática para chegar ao módulo a partir das vossas explicações.

x%y = (x/y) € |R * (-y)

a parte inteira da divisao de x por y vai ser o numero de vezes que o y vai diminuir

Share this post


Link to post
Share on other sites
mogers

Não sei se esta perspectiva ajuda mas como aprendemos na primária, Dividendo = Quociente * Divisor + Resto, i.e. 15 = 3 * 4 + 3

A única coisa que estás a fazer é simular a multiplicação do quociente pelo divisor com subtracções sucessivas.

PS: a multiplicação seria uma série de somas, mas como queres o resto estás a fazer subtracções.

Edited by mogers

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Share this post


Link to post
Share on other sites
mogers

x%y = (x/y) € |R * (-y)

a parte inteira da divisao de x por y vai ser o numero de vezes que o y vai diminuir

O conjunto dos números inteiros é o Z. O |R são os números reais (incluí 1.25, 0.333333(3), etc).


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Share this post


Link to post
Share on other sites
Dexter's Lab

O conjunto dos números inteiros é o Z. O |R são os números reais (incluí 1.25, 0.333333(3), etc).

Exatamente, tens toda a razão. Confundi na altura porque tinha a concentração posta num post algures que referia isso. Inclusive era |N que me queria referir. Obrigado pela atenção ao pessoal que participou. Amanhã ou depois coloco o programa aqui

Share this post


Link to post
Share on other sites
Dexter's Lab

Boas, está aqui o código para alguém que tenha a mesma dúvida que tive.

#include <stdio.h>
#define PAUSE getch();
void MODULE_(int *a, int *b);
int CONFIRM_(int a, int b);
void MENU_();
int main (void)
{
 do {
  MENU_();
 } while (1);

 PAUSE;
return 0;
}
void MENU_()
{
int val1, val2;

 printf("\n\nNUMBER: "); scanf(" %d", &val1);
 printf("\nNUMBER: "); scanf(" %d", &val2);

 MODULE_(&val1, &val2);

 printf("MODULE: %d", val1);

 if (CONFIRM_(val1, val2) == 0)
   printf ("\n\tEXAT RESULT FROM DIVISION!\n\n");

   PAUSE;
}
void MODULE_(int *a, int *b)
{
  int cont;
 int aux = *a / *b;

 for (cont = 1; cont <= aux; cont ++)
   *a -= *b;
}
int CONFIRM_(int a, int b)
{
  if (a == 0)
   return 0;
 else
  return 1;
}

  • Vote 1

Share this post


Link to post
Share on other sites
HappyHippyHippo

Boas, está aqui o código para alguém que tenha a mesma dúvida que tive.

#include <stdio.h>
#include <stdlib.h>

int resto(int a, int b)
{
 int signal = 1;

 // converter numeros negativos em positivos
 if (a < 0) {
   a -= 2*a;
   signal *= -1;
 }
 if (b < 0) {
   b -= 2*b;
   signal *= -1;
 }

 // descobrir o resto com subtraccoes sucessivas
 while (a > b)
   a -= b;

 // retornar o resto da divisao de positivos com correccao de sinal
 return a * signal;
}

int main()
{
 int a = 24, b = -7;
 printf("o resto da divisao entre %d e %d : %d\n", a, b, resto(a, b));
 return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.