Ir para o conteúdo
nana91

Fraction

Mensagens Recomendadas

nana91    0
nana91

Preciso de ajuda, tenho o seguinte problema:

tenho esta função que faz multiplicação de fracções, por exemplo:

(4/9)*(3/8)=(12/72) mas o meu problema quer que simplifique a fracção e para isso tenho de introduzir uma função de maneira que

Main> multiFraction (4,9)(3,8)

(1,6)

Também sei que para simplificar uma fracção dividimos tanto o numerador como o denominador pelo máximo divisor comum, ou seja:

mdc (12,72) = 12

Logo (12/12)=1 e (72/12)=6

Assim (12/72)=(1/6)

Alguém me pode ajudar

type Fraction = (Int, Int)

multiplyFraction :: Fraction -> Fraction -> Fraction
multiplyFraction (x1, y1) (x2, y2) = (x1*x2,y1*y2)

:)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nana91    0
nana91

Olá pessoal! Ando aqui com a minha função e já a construi de maneira a que simplificasse as fracções, mas te nho um caso que me está a dar a volta à cabeça  :rant_01:, é o seguinte:

A minha função é:

type Fraction = (Int, Int)

multiplyFraction :: Fraction -> Fraction -> Fraction
multiplyFraction (x1, y1) (x2, y2) = (((x1*x2) `div` (gcd x1 y1)),((y1*y2) `div` (gcd x1 y1)))

Quando testo a função com este exemplo, não me dá o que quero..

Main> multiplyFraction (4,9)(3,8)

(12,72)

E deveria dar (1,6)

O que acham que está a acontecer, terei de mudar a fórmula, terei de pôr uma coisa parecida a esta:

type Fraction = (Int, Int)

multiplyFraction :: Fraction -> Fraction -> Fraction
multiplyFraction (x1, y1) (x2, y2)
| gcd (x1*x2) (y1*y2) == 1 = 
| otherwise = (((x1*x2) `div` (gcd x1 y1)),((y1*y2) `div` (gcd x1 y1)))

Se não é esta fórmula podem dizer-me alguma alternativa

:D

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nana91    0
nana91

Eu já sabia que (12,72) era igual a (1,6), mas não estou a ver como reduzir o resultado da multiplicação, podes dar-me mais alguma dica.

:D

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
Betovsky

Ignora se é uma multiplicação ou não.

Fazes a multiplicação de forma normal, depois com o resultado, que é uma fracção reduzes de forma normal, como se aprendeu na escola. Sacas o gcd de ambos os elementos e aplicas a divisão a ambos.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nana91    0
nana91

Resolvido

type Fraction = (Int, Int)

simple :: Integral a => a -> a -> a
simple x y
| y == 0 = x
| otherwise = simple y (mod x y)

multiplyFraction :: Fraction -> Fraction -> Fraction
multiplyFraction (x1, y1) (x2, y2) = ((x1*x2) `div` (simple (x1*x2) (y1*y2)),(y1*y2) `div` (simple (x1*x2) (y1*y2)))

E vocês como fariam?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous
multiplyFraction :: Fraction -> Fraction -> Fraction
multiplyFraction (x1, y1) (x2, y2) = let d = x1*x2
                                         n = y1*y2
                                         g = gcd d n
                                     in (div d g, div n g)

Partilhar esta mensagem


Link 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