Jeśli jesteś właścicielem tej strony, możesz wyłączyć reklamę poniżej zmieniając pakiet na PRO lub VIP w panelu naszego hostingu już od 4zł!
2013-02-12    Programowanie, C, C++, Błąd

Jeden z najlepszych programistów z Polski, pracownik Google - Gynvael Coldwind co jakiś czas dodaje na swój kanał na Youtube poradniki o informatyce. Ostatni filmik pt.: "Bardzo Duże Liczby" wyjaśnia jak zawsze w sposób niesamowicie czytelny i zrozumiały. Jednak tym razem zdarzył mu się malutki bug w jego kodzie, a mi się udało go wyłapać.

Pod filmikiem napisałem już komentarz i oczywiście została mi przyznana rację. Zachęcam do obejrzenia tego filmiku oraz do przeczytania mojej sugestii.

Bug można naprawić na kilka różnych sposobów.

Poniższe rozwiązanie może nie należy do najpiękniejszych, ale co najważniejsze działa:
 
void vli_add(vli_st &dst, vli_st &a, vli_st &b) 
{
  size_t max_count = a.count > b.count ? a.count : b.count;
  dst.count = max_count + 1;
  dst.digits = new unsigned char[dst.count];
  memset(dst.digits, 0, dst.count);
 
  for(size_t i = 0; i < max_count; i++) {
    if(i < a.count) dst.digits[i] += a.digits[i];
    if(i < b.count) dst.digits[i] += b.digits[i];
 
    dst.digits[i + 1] = dst.digits[i] / 10;
    dst.digits[i] %= 10;
  }
 
  if(!dst.digits[max_count])
    dst.count--;
}
 
Równie dobrze można sprawdzić przy print'cie czy najbardziej znacząca cyfra to 0. Ale moim zdaniem najlepszym sposobem będzie obliczenie czy nastąpi przeniesie w momencie kiedy rezerwujemy dodatkowy bajt na przeniesienie. Jednak zaimplementowanie tego sposobu pozostawiam Wam jako praca domowa .
Dodaj komentarz:
Nick:
URL(opcjonalnie):