• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Algorytm dzielenia liczb binarnych

Object Storage Arubacloud
0 głosów
672 wizyt
pytanie zadane 14 lutego 2022 w C i C++ przez Dobdo Użytkownik (570 p.)

Cześć. Mam w podręczniku taki algorytm w pseudokodzie i nie potrafię zrozumieć kilka jego części:

1. reszta <- a[0...d-1]

Co właściwie robi ten fragment? Chodzi o to by dodać kolejne elementy z tablicy od podanych id? W sumie tak zrobiłem, ale nie przyniosło to oczekiwanych rezultatów.

 

2. if(reszta  < b)

Z założeń przedstawionych na poprzedniej stronie reszta i b to stringi więc jak ma to właściwie działać? Jak interpretować ten fragment. Mimo wszystko spróbowałem napisać to zgodnie z wytycznymi książki, a później dodatkowo  dodać tam funkcję stoi jednak nie wiem czy o to chodziło:

Dodaj - Algorytm dodawania 2 liczb

Przeciwna - Zamienia liczbę na przeciwną w kodzie U2

Odejmij - Zwraca różnicę 2 podanych liczb

 

#include <iostream>
#include <string>
using namespace std;

string Dodaj(string a, string b)
{
    int przn = 0;
    string c;


    while(a.size() < b.size())
    {
        a = '0' + a;
    }

    while(b.size() < a.size())
    {
        b = '0' + b;
    }

    for(int i = a.size() -1; i >= 0; i--)
    {
       int suma = przn + a[i]-'0' + b[i]-'0';
       if(suma % 2 == 1)
       {
           c = '1' + c;
       }
       else
       {
           c = '0' + c;
       }

       przn /= 2;
    }

    if(przn == 1)
    {
        c = '1' + c;
    }

    return c;
}

string Przeciwna(string s)
{
    int i = 0;
    for(i = 0; i < 8; i++)
    {
        if(s[i] == '0')
        {
            s[i] = '1';
        }
        else
        {
            s[i] = '0';
        }
    }

    s = '0' + s;
    i = 8;

    while(s[i] == '1')
    {
        s[i] = '0';
        i--;
    }
    s[i] = '1';
    return s.substr(1,8);
}

string Odejmij(string a, string b)
{
    return Dodaj(a, Przeciwna(b));
}

int main()
{

    int ilorazc = 1, d;
    string a, b, reszta;
    cin >> a >> b;

    d = b.size();

    for(int i = 0; i < d; i++)
    {
    reszta += a[i];
    }

    if(stoi(reszta) < stoi(b))
    {
        reszta += a[d];
        d++;
    }

    reszta = Odejmij(reszta, b);

    for(int i = d; i < a.size(); i++)
    {
        reszta += a[i];
        if(stoi(reszta) < stoi(b))
        {
            ilorazc += '0';
        }
        else
        {
            ilorazc += '1';
            reszta = Odejmij(reszta,b);
        }
    }


    cout<< reszta;

    return 0;


}

 

1 odpowiedź

+2 głosów
odpowiedź 14 lutego 2022 przez overcq Pasjonat (21,730 p.)
wybrane 14 lutego 2022 przez Dobdo
 
Najlepsza
  1.  Nie, masz w komentarzu do tej linii: “zapisanie w zmiennej reszta d pierwszych znaków z napisu a”.
  2.  Potrzebna jest osobna funkcja porównująca, ponieważ liczba może się nie zmieścić w granicach typu int.

W funkcji Dodaj masz błąd. Nie powinno być raczej:

przn = suma / 2;

Reszty nie sprawdzałem.

Algorytm opiera się o pisemne dzielenie, tylko na liczbach binarnych. I wydaje się również błędny, ponieważ na początku arbitralnie przypisuje do wyniku pierwszą 1.

komentarz 14 lutego 2022 przez Dobdo Użytkownik (570 p.)

zapisanie w zmiennej reszta d pierwszych znaków z napisu a

Nie mam pojęcia jak zrozumieć ten fragment. Czyli, że do zmiennej reszta przypisujemy kolejne d znaków ze zmiennej a? Bo brzmi to tak jak pętla, którą zastosowałem do rozwiązania tego problemu (Linie 85-88). Czy mógłbyś pokazać jak to przedstawić w c++?

 

Co do tej 1 na początku to chyba wynika to z założenia, że a > b zawsze:

 

 

komentarz 14 lutego 2022 przez overcq Pasjonat (21,730 p.)
edycja 14 lutego 2022 przez overcq

Ok, czyli jest to za­łoże­nie, że a > b.

Pod ram­ką jest opi­sa­ne dok­ła­d­nie, co ro­bi ta li­nia. Tyl­ko de­fi­niujesz to ja­ko do­da­wa­nie (su­mo­wa­nie), a jest to scala­nie czyli su­bstr.

Twoja fun­kcja Prze­ci­w­na nie ma szans dzia­łać po­pra­w­nie, po­nie­waż nie zna dłu­go­ś­ci zmien­nej reszta, po­d­czas gdy mu­si do­dać je­dyn­ki na po­czą­t­ku do dłu­go­ś­ci tej zmien­nej. Może le­piej za­im­ple­men­to­wać fun­kcję Odej­mij wprost? Na przykład:

#include <iostream>
#include <string>
using namespace std;
 
string Dodaj(string a, string b)
{
    int przn = 0;
    string c;
 
 
    while(a.size() < b.size())
    {
        a = '0' + a;
    }
 
    while(b.size() < a.size())
    {
        b = '0' + b;
    }
 
    for(int i = a.size() -1; i >= 0; i--)
    {
       int suma = przn + a[i]-'0' + b[i]-'0';
       if(suma % 2 == 1)
       {
           c = '1' + c;
       }
       else
       {
           c = '0' + c;
       }
 
       przn = suma / 2;
    }
 
    if(przn == 1)
    {
        c = '1' + c;
    }
 
    return c;
}
 
string Odejmij(string a, string b)
{
    int przn = 0;
    string c;
 
 
    while(a.size() < b.size())
    {
        a = '0' + a;
    }
 
    for(int i = 0; i < b.size(); i++)
    {
        if(b[i] == '0')
        {
            b[i] = '1';
        }
        else
        {
            b[i] = '0';
        }
    }
    b = Dodaj( b, "1" );
    while(b.size() < a.size())
    {
        b = '1' + b;
    }
 
    for(int i = a.size() -1; i >= 0; i--)
    {
       int suma = przn + a[i]-'0' + b[i]-'0';
       if(suma % 2 == 1)
       {
           c = '1' + c;
       }
       else
       {
           c = '0' + c;
       }
 
       przn = suma / 2;
    }
 
    return c;
}
 
int main()
{
 
    string ilorazc = "1";
    int d;
    string a, b, reszta;
    cin >> a >> b;
 
    d = b.size();
 
    reszta = a.substr(0, d);

    if(stoi(reszta,0,2) < stoi(b,0,2))
    {
        reszta += a[d];
        d++;
    }

    reszta = Odejmij(reszta, b);

    for(int i = d; i < a.size(); i++)
    {
        reszta += a[i];
        if(stoi(reszta,0,2) < stoi(b,0,2))
        {
            ilorazc += '0';
        }
        else
        {
            ilorazc += '1';
            reszta = Odejmij(reszta,b);
        }
    }
 
 
    cout << ilorazc << endl;
 
    return 0;
 
 
}

Pozostaje napisanie funkcji porównującej zamiast stoi.

komentarz 14 lutego 2022 przez Dobdo Użytkownik (570 p.)
Teraz wszystko ma więcej sensu. Nie sądziłem że z tym pierwszym problemem chodzi o użycie tam substr. Przeanalizuję poprzednie algorytmy i raczej już sobie poradzę. Dziękuję ślicznie

Podobne pytania

0 głosów
1 odpowiedź 1,292 wizyt
pytanie zadane 11 marca 2018 w C i C++ przez Hikori Nowicjusz (180 p.)
0 głosów
2 odpowiedzi 2,007 wizyt
pytanie zadane 16 lutego 2016 w C i C++ przez tarnasm Gaduła (3,030 p.)
0 głosów
1 odpowiedź 1,951 wizyt
pytanie zadane 23 listopada 2015 w C i C++ przez Mateep Użytkownik (850 p.)

92,584 zapytań

141,433 odpowiedzi

319,668 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...