Hej, mam do napisania program, ktory wykonuje rozne matematyczne obliczenia w pewnym momencie pojawia sie dzielenie w wyniku czego powstaja liczby wymierne jednak nie mamy je przedstawic w postaci ulamka zwklego tylko liczby okresowej tj 0,(3) zamist 1/3 i wlasnie z tym mam problem, jest moze w javie jakas klasa ktora rozwiazuje ten problem.
Myslalem, aby dzielenie wpisac do Stringa np dlugosci 50 znakow i za pomoca wyrazen regularnych szukac powtorzen ale ciezko mi idzie skonstruowanie takiego wyrazenia , w najgorszym wypadku szukanie mozolne po tym stringu ale to tez srednio fajne jak okres bedzie wiekszy ;< rzucilby ktos jakims ciekawym pomyslem aby rozwiac ten problem bo na razie w internecie nie napotkalem na nic ciekawego, albo jakis algorytm najlepiej przydalaby sie jakas fajna klasa ;D?
Klasy jako takiej nie ma. W tym zadaniu chodzi nie tyle co o szukanie ułamka okresowego co o umiejętność zastosowania narzędzi do analizy ciągu znaków w celu wykrywania powtórzeń. W sumie jedynym rozsądnym wyjściem jest w tym przypadku ręczne szukanie dopasowania.
Sama metoda nie jest aż taka skomplikowana ponieważ wystarczy zbudować sobie odpowiedni "słownik" złożony ze znaków po przecinku i poszukać powtórzeń.
było takie zadanie na spoju.
Ogólnie to się robi tak, robiąc dzielenie po przekroczeniu przecinka zapamiętujesz kolejne reszty z dzielenia, jeśli znajdziesz powtórkę reszty z dzielenia to już znasz okres ułamka.
Wlasnie nie bardzo wiem gdzie znalezc cos o tych slownikach, probowalem szukac w algorytmach do analizy tekstu ale tam raczej skupiaja sie na szukaniu powtorzen na przykladzie wzorca, czy musialbym poczatek "pociac" i tymi algorytami szukac tych powtorzen?
Wlasnie wiem ze nalezy zapamietac, ale jak a jak sie trafi liczba np. 12324516789112245126789(123456789123456789) to zapamietywanie fragmecikow i porownywanie czy nastepne framenty sa takie same bedzie raczej klopotliwe jak okres pojawia sie dopiero na 23 indeksie ;<
a wyszukanie kolejnych dublikatow okreslonej liczby np kolejnego wystapienia 1 i sparwdzenie na Stringach tylko tego fragmentu od 1 do 1 i pozniej "symetrycznie" czy sa takie same ?
Nie wiem czy już poradziłeś sobie z zadaniem. Jeśli nie, to masz kod (implementacja pomysłu @MarekR22'a). Działa przy założeniu, że 0<licznik<mianownik.
ArrayList<Integer> reszty = new ArrayList<Integer>();
ArrayList<Integer> cyfry = new ArrayList<Integer>();
int indeks = 0;
reszty.add(10*licznik);
cyfry.add(reszty.get(indeks) / mianownik);
while(true)
{
int nowaReszta = 10*(reszty.get(indeks) % mianownik);
int nowaCyfra = nowaReszta / mianownik;
int i = reszty.indexOf(nowaReszta);
if(i == -1)
{
reszty.add(nowaReszta);
cyfry.add(nowaCyfra);
indeks++;
}
else
{
StringBuilder sb = new StringBuilder("0,");
for(int k=0;k<i;k++)
{
sb.append(""+cyfry.get(k));
}
sb.append("(");
for(int k=i;k<cyfry.size();k++)
{
sb.append(""+cyfry.get(k));
}
sb.append(")");
System.out.println(sb);
break;
}
}
Dzieki juz wlasnie poradzilem sobie z tym zadaniem tylko zrobilem to na tablicach ;)