Alguem resolve Desenvolver um algoritmos que realize a divisão de dois números inteiros e retorne o quaciente e o resto dessa divisão. Mas para isso vc não poderá usar os operadores / (Divisão) e o operador % (Resto da divisão).
Soluções para a tarefa
Respondido por
1
Me pareceu desafiador, então resolvi fazer.
algoritmo "divide"
var
divs, divd, res, x, y, i: inteiro
sub: inteiro
quo, i: real
inicio
escreva("Informe o dividendo: ")
leia(y)
escreva("Informe o divisor: ")
leia(x)
divs = x
divd = y
se (x < 0) entao
divs = divs * -1
fimse
se (y < 0) entao
divd = divd * -1
fimse
res = divd
enquanto (res >= divd) e (divs <= divd) faca
i = 0
enquanto (sub < divd) e (sub + divs <= divd) faca
sub = sub + divs
i = i + 1
fimenquanto
quo = (quo + i * 0,1) * 10
divd = divd - sub
res = divd
fimenquanto
se (x xor y < 0) entao
quo = quo * -1
fimse
escreva("Resultado: ", quo)
escreva("Resto: ", res)
fimalgoritmo
Se você utiliza o Visualg, altere os sinais de atribuição "=" por ":=" sem aspas e terá que fazer outras adaptações. Vou explicar o que eu fiz e a lógica que utilizei.
Lógica
Um laço de repetição para ir subtraindo valores do dividendo, que sejam múltiplos do divisor. E um laço dentro do laço para pegar os múltiplos do divisor que sejam menor ou igual ao dividendo. Depois ir armazenando o quociente e resultado do resto da divisão.
x e y: essas variáveis foram só para ler o dividendo e divisor, caso eu quisesse pôr a mensagem no final: escreva(x / y = quo e x % y = res)
divs e divd: são o divisor e o dividendo. Uma das condições para que o primeiro laço se repita, é exatamente que o divisor seja menor ou igual ao dividendo.
res e quo: são o resto da divisão e o quociente. O resto da divisão é sempre igual ao dividendo. E o quociente é igual ao número do múltiplo do divisor utilizado na subtração "concatenado" com os outros múltiplos do divisor utilizado. Essa conta estranha de multiplicar por 0,1 e depois 10 foi uma forma que encontrei de fazer essa "concatenação". Se não funcionar aí, tente retirar os parênteses.
Note que o quociente é real, exatamente por causa dessa conta fracionária.
sub e i: sub é o valor que subtrairemos do dividendo. Esse valor é múltiplo do divisor. E o i indica qual múltiplo foi, se foi 2x o divisor, 3x, 5x, nx...
Em resumo esse algoritmo recebe os valores do divisor e dividendo, e enquanto o resto da divisão for maior ou igual dividendo e o divisor for menor ou igual ao dividendo, ele vai calcular qual é o maior valor que pode subtrair do dividendo, que seja múltiplo do divisor e armazenar no quociente. E também pegar o resto da divisão, fazendo isso até não poder dividir mais.
Obs.: esse algoritmo só aceita valores inteiros. Codifiquei em C e funcionou com todos os valores que testei, que não foram poucos.
Segue o anexo do teste de mesa
Valores Negativos
O algoritmo aceita valores negativos, ele os converte em positivo lá no começo e para o resultado ser positivo ou negativo temos o seguinte:
positivo / positivo = positivo
positivo / negativo = negativo
negativo / positivo = negativo
negativo / negativo = positivo
É a complementar da tabela verdade do XOR (Exclusive OR), ou XNOR. Então se x xor y = verdadeiro, eu exibo o resultado como negativo. Se x xor y = falso, então eu exibo o resultado como positivo. Teste o algoritmo com valores como 25/5, 25/-5, -25/5, -25/-5 e etc... e outros valores.
algoritmo "divide"
var
divs, divd, res, x, y, i: inteiro
sub: inteiro
quo, i: real
inicio
escreva("Informe o dividendo: ")
leia(y)
escreva("Informe o divisor: ")
leia(x)
divs = x
divd = y
se (x < 0) entao
divs = divs * -1
fimse
se (y < 0) entao
divd = divd * -1
fimse
res = divd
enquanto (res >= divd) e (divs <= divd) faca
i = 0
enquanto (sub < divd) e (sub + divs <= divd) faca
sub = sub + divs
i = i + 1
fimenquanto
quo = (quo + i * 0,1) * 10
divd = divd - sub
res = divd
fimenquanto
se (x xor y < 0) entao
quo = quo * -1
fimse
escreva("Resultado: ", quo)
escreva("Resto: ", res)
fimalgoritmo
Se você utiliza o Visualg, altere os sinais de atribuição "=" por ":=" sem aspas e terá que fazer outras adaptações. Vou explicar o que eu fiz e a lógica que utilizei.
Lógica
Um laço de repetição para ir subtraindo valores do dividendo, que sejam múltiplos do divisor. E um laço dentro do laço para pegar os múltiplos do divisor que sejam menor ou igual ao dividendo. Depois ir armazenando o quociente e resultado do resto da divisão.
x e y: essas variáveis foram só para ler o dividendo e divisor, caso eu quisesse pôr a mensagem no final: escreva(x / y = quo e x % y = res)
divs e divd: são o divisor e o dividendo. Uma das condições para que o primeiro laço se repita, é exatamente que o divisor seja menor ou igual ao dividendo.
res e quo: são o resto da divisão e o quociente. O resto da divisão é sempre igual ao dividendo. E o quociente é igual ao número do múltiplo do divisor utilizado na subtração "concatenado" com os outros múltiplos do divisor utilizado. Essa conta estranha de multiplicar por 0,1 e depois 10 foi uma forma que encontrei de fazer essa "concatenação". Se não funcionar aí, tente retirar os parênteses.
Note que o quociente é real, exatamente por causa dessa conta fracionária.
sub e i: sub é o valor que subtrairemos do dividendo. Esse valor é múltiplo do divisor. E o i indica qual múltiplo foi, se foi 2x o divisor, 3x, 5x, nx...
Em resumo esse algoritmo recebe os valores do divisor e dividendo, e enquanto o resto da divisão for maior ou igual dividendo e o divisor for menor ou igual ao dividendo, ele vai calcular qual é o maior valor que pode subtrair do dividendo, que seja múltiplo do divisor e armazenar no quociente. E também pegar o resto da divisão, fazendo isso até não poder dividir mais.
Obs.: esse algoritmo só aceita valores inteiros. Codifiquei em C e funcionou com todos os valores que testei, que não foram poucos.
Segue o anexo do teste de mesa
Valores Negativos
O algoritmo aceita valores negativos, ele os converte em positivo lá no começo e para o resultado ser positivo ou negativo temos o seguinte:
positivo / positivo = positivo
positivo / negativo = negativo
negativo / positivo = negativo
negativo / negativo = positivo
É a complementar da tabela verdade do XOR (Exclusive OR), ou XNOR. Então se x xor y = verdadeiro, eu exibo o resultado como negativo. Se x xor y = falso, então eu exibo o resultado como positivo. Teste o algoritmo com valores como 25/5, 25/-5, -25/5, -25/-5 e etc... e outros valores.
Anexos:
Respondido por
0
Resposta:
Algoritmo "divisao recursiva"
Var
n1, n2, c, i, r, resto, multi, aux:inteiro
inicio
escreva("Digite o dividendo: ")
leia(n1)
escreva("Digite o divisor: ")
leia(n2)
aux <- n1
enquanto n1 >=0 faca
se n1>=n2 ENTAO
c := c+1
fimse
n1 := n1-n2
fimenquanto
se n1<0 ENTAO
r:=n1+n2
fimse
escreval("Resultado -:",c)
escreval("Resto -----:",r)
Fimalgoritmo
Explicação:
Perguntas interessantes
Filosofia,
9 meses atrás
Pedagogia,
9 meses atrás
Matemática,
9 meses atrás
Sociologia,
1 ano atrás
Administração,
1 ano atrás
Matemática,
1 ano atrás