Zamiana liczby binarnej na dziesiętną, znalezienie minimum i maksimum

0

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.

5

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?

0
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.

1

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:

  1. wyrównaj zerami wszystkie stringi do 250 znaków, użyj operatora < bezpośrednio na stringach
  2. użyj jakiejś biblioteki do bigintów.
  3. zaimplementuj prostego biginta jako tuple 4x 64bitowych uintów (albo 2x 128).

W przypadku tego zadania opcja 1. wydaje się najsensowniejsza.

3

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()?

0
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

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