Witam. Napisałem program, który ma za zadanie: zamienić dane z pliku, które są liczbami binarnymi, na liczby dziesiętne. Następnie chcę znaleźć najmniejszą i największą liczbę oraz podać numery wierszy, w których te liczby się znajdują. Mój kod prezentuje się następująco: Link. Niestety, ale odpowiedzi nie są poprawne. Czy ktoś mógłby mnie nakierować na błąd,jaki tutaj popełniłem? :) Warto też dodać, że w zadaniu jest powiedziane, że każda liczba binarna zawiera co najwyżej 250 cyfr binarnych. Pozdrawiam.
Niezależnie jak rozumiesz "liczby binarne" (czy bezpośredni zapis ich reprezentacji, czy też ciąg zer i jedynek), funkcja dziesiętny
dokonuje błędnej konwersji.
Dodatkowo: < 250 cyfr binarnych. Zagadka: jakiej wielkości są typy danych w twoim systemie? Czy np. typ 64-bitowy pomieści 250 bitów?
kq napisał(a):
Niezależnie jak rozumiesz "liczby binarne" (czy bezpośredni zapis ich reprezentacji, czy też ciąg zer i jedynek), funkcja
dziesiętny
dokonuje błędnej konwersji.Dodatkowo: < 250 cyfr binarnych. Zagadka: jakiej wielkości są typy danych w twoim systemie? Czy np. typ 64-bitowy pomieści 250 bitów?
Racja. Zmieniłem tę funkcję. Teraz wygląda tak:
unsigned long long dziesietny(string s)
{
unsigned long long wynik=0;
for(int i=0;i<s.length();i++)
{
wynik+=(s[s.length()-i-1]-'0')*pow(2,i);
}
return wynik;
}
Zmieniłem też typ zmiennej wynik. Jednak odpowiedzi nadal nie są poprawne.
Ta moja zagadka nie została umieszczona przez przypadek. 250 bitów nie zmieścisz w zmiennej 64-bitowej.
Przychodzą mi na myśl dwie trzy opcje:
- wyrównaj zerami wszystkie stringi do 250 znaków, użyj operatora
<
bezpośrednio na stringach - użyj jakiejś biblioteki do bigintów.
- zaimplementuj prostego biginta jako tuple 4x 64bitowych uintów (albo 2x 128).
W przypadku tego zadania opcja 1. wydaje się najsensowniejsza.
Jeśli poznam powody "dlaczego nie...", zerknę dokładniej do Twojego kodu.
Dlaczego nie zastosowałeś kontenera <bitset>? Ma wszystko czego potrzebujesz. Dane binarne wczytasz bezpośrednio, sprawdzisz ich długość bitową a porównasz poprzez wywołanie to_string()?
Mokrowski napisał(a):
Jeśli poznam powody "dlaczego nie...", zerknę dokładniej do Twojego kodu.
Dlaczego nie zastosowałeś kontenera <bitset>? Ma wszystko czego potrzebujesz. Dane binarne wczytasz bezpośrednio, sprawdzisz ich długość bitową a porównasz poprzez wywołanie to_string()?
Dlatego, że jeszcze go nie poznałem, ale właśnie sobie o nim czytam, dzięki. Jednak chodzi mi konkretnie o ten sposób rozwiązania zadania, ponieważ nie mogłem wyłapać, gdzie jest błąd. Szukając innego wyjścia, wpadłem na banalne rozwiązanie: sprawdzenie długości stringów a w wypadku równej długości, porównanie ich.
Edit:
Link