Jak rozpoznać czy ułamek jest ułamkiem dziesiętnym skończonym lub nieskończonym?

0

Witam!
Mam problem z rozpoznaniem czy ułamek zwykły (po podzieleniu), będzie skończony lub nieskończony.

Np 1/3 - 0,33333333333 - ułamek nieskończony
1/4 - 0,25 - ułamek skończony

W C# ułamek reprezentuje za pomocą prostej strukturki:

struct Ulamek
{
      int _licznik, _mianownik;
}

Jakieś pomysły?

3

Mianownik musi być postaci 2m * 5n

0

Ok a skąd wziąć m i n?

3

Możesz albo wykonać rozkład na czynniki pierwsze i sprawdzić czy zawiera tylko dwójki i piątki (to jest the hard way).

Albo możesz zrobić coś w rodzaju:

n = denominator
while (n mod 2 == 0):
    n = n div 2
while (n mod 5 == 0):
    n = n div 5
return (n == 1)

(dzielisz przez dwa do kiedy się da. Później dzielisz przez 5 do kiedy się da. Jeśli nie wyszło jeden - występują inne liczby w rozkładzie).

0
msm napisał(a):

czyli prościej:

n = denominator
while (n mod 2 == 0):
    n = n div 2
return (n == 1) || (n == 5)

Testowałeś dla ułamka 1/25 = 0,04? ;)

1

To może mój skrócony kod:

while (n % 5 == 0)
    n /= 5;
return (n & (n-1) == 0);

1 użytkowników online, w tym zalogowanych: 0, gości: 1