Ir para o conteúdo
Dexter's Lab

Saber resultado exato

Mensagens Recomendadas

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por Dexter's Lab

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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)

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
}

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.