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

Mnożenie liczb w różnych systemach pozycyjnych

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
591 wizyt
pytanie zadane 12 sierpnia 2022 w C i C++ przez Noizz00 Użytkownik (910 p.)

Cześć, napisałem program, który dla następujących danych wejściowych:

a - pierwsza liczba, b - druga liczba, p - podstawa systemu

ma wyznaczyć wynik działania a * b, bez przechodzenia na system dziesiętny i odwrotnie.

Poniżej kod programu:

#include <iostream>

using namespace std;

string MnozPrzezCyfr(char cfr, string liczba, int pdst)
{
    int iloczyn = 0, przn = 0;
    string wynik = "";
    int cyfra1, cyfra2;
    if(cfr<='9') cyfra1 = cfr - '0';
    else cyfra1 = cfr - 'A' + 10;
    for(int i = liczba.size()-1; i>=0; i--)
    {
        if(liczba[i]<='9') cyfra2 = liczba[i] - '0';
        else cyfra2 = liczba[i] - 'A' + 10;
        iloczyn = cyfra1 * cyfra2 + przn;
        if(iloczyn<10) wynik = char(iloczyn%pdst + '0') + wynik;
        else wynik = char(iloczyn%pdst + 'A' - 10) + wynik;
        przn = iloczyn / pdst;
    }
    if(przn > 0 && przn < 10) wynik = char(przn + '0') + wynik;
    else if(przn > 9) wynik = char(przn + 'A' - 10) + wynik;
    return wynik;
}

string Dodaj(string a, string b, int pdst)
{
    int suma = 0, przn = 0;
    string wynik = "";
    int cyfra1, cyfra2;
    while(a.size()>b.size()) b = '0' + b;
    while(b.size()>a.size()) a = '0' + a;
    for(int i = a.size()-1; i>=0; i--)
    {
        if(a[i]<='9') cyfra1 = a[i] - '0';
        else cyfra1 = a[i] - 'A' + 10;
        if(b[i]<='9') cyfra2 = b[i] - '0';
        else cyfra2 = b[i] - 'A' + 10;
        suma = cyfra1 + cyfra2 + przn;
        if(suma<10) wynik = char(suma%pdst+'0') + wynik;
        else wynik = char(suma%pdst+'A'-10) + wynik;
        przn = suma / pdst;
    }
    if(przn > 0 && przn < 10) wynik = char(przn + '0') + wynik;
    else if(przn > 9) wynik = char(przn + 'A' - 10) + wynik;
    return wynik;
}

int main()
{
    string a, b, c, pom;
    int p, d;
    cout << "Podaj podstawe systemu: ";
    cin >> p;
    cout << "Podaj liczby: ";
    cin >> a >> b;
    d = b.size()-1;
    for(int i = d; i>=0; i--)
    {
        pom = MnozPrzezCyfr(b[i], a, p);
        for(int j = 1; j <= d - i; j++) pom = pom + '0';
        c = Dodaj(c,pom,p);
    }
    cout << "Iloczyn: "<<c;
    return 0;
}

Cała zasada programu opiera się na odczytywaniu wartości poszczególnych cyfr liczby, następnie dodaniu ich bądź pomnożeniu razem z wartością przesunięcia przn (czyli ilości podstaw mieszczących się w wyniku poprzednich działań, np. przy mnożeniu w systemie dziesiątkowym 4 * 4 otrzymujemy 16 - w wyniku podstawa 10 mieści się raz - przesunięcie wynosi 1 i jest dodawane do wyniku mnożenia/sumy kolejnych cyfr, a pod 'kreską' zapisujemy resztę z tego dzielenia, czyli 6). Działania oparte są więc na zasadach dodawania i mnożenia pisemnego.

Problem pojawia się np. dla danych wejściowych 7 (podstawa), 6543 (liczba a), 432 (liczba b). Poprawnym wynikiem powinien być ciąg 4226136, program natomiast zwraca ciąg 4:;=136 - czyli zamiast 226 wyświetla :;=. Wydaje mi się, że sformułowałem wszystkie wywołania funkcji char() dobrze, jednak jak się okazuje jest coś nie tak z dopisywaniem odpowiednich znaków do wyniku.

Będę wdzięczny za wskazanie błędu.

1
komentarz 14 sierpnia 2022 przez TOWaD Mądrala (6,250 p.)

nie wiem czy porwanie ale wynik jest bez średnika, dwukropka i równa się,

#include <iostream>
 
using namespace std;
 
string MnozPrzezCyfr(char cfr, string liczba, int pdst)
{
    int iloczyn = 0, przn = 0;
    string wynik = "";
    int cyfra1, cyfra2;
    if(cfr<='9') cyfra1 = cfr - '0';
    else cyfra1 = cfr - 'A' + 10;
    for(int i = liczba.size()-1; i>=0; i--)
    {
        if(liczba[i]<='9') cyfra2 = liczba[i] - '0';
        else cyfra2 = liczba[i] - 'A' + 10;
        iloczyn = cyfra1 * cyfra2 + przn;
        /*if(iloczyn<10)*/ wynik = char(iloczyn%pdst + '0') + wynik;
       // else wynik = char(iloczyn%pdst + 'A' - 10) + wynik;
        przn = iloczyn / pdst;
    }
    if(przn > 0 && przn < 10) wynik = char(przn + '0') + wynik;
    else if(przn > 9) wynik = char(przn + 'A' - 10) + wynik;
    return wynik;
}
 
string Dodaj(string a, string b, int pdst)
{
    int suma = 0, przn = 0;
    string wynik = "";
    int cyfra1, cyfra2;
    while(a.size()>b.size()) b = '0' + b;
    while(b.size()>a.size()) a = '0' + a;
    for(int i = a.size()-1; i>=0; i--)
    {
        if(a[i]<='9') cyfra1 = a[i] - '0';
        else cyfra1 = a[i] - 'A' + 10;
        if(b[i]<='9') cyfra2 = b[i] - '0';
        else cyfra2 = b[i] - 'A' + 10;
        suma = cyfra1 + cyfra2 + przn;
        /*if(suma<10)*/ wynik = char(suma%pdst+'0') + wynik;
       // else wynik = char(suma%pdst+'A'-10) + wynik;
        przn = suma / pdst;
    }
    /*if(przn > 0 && przn < 10)*/ wynik = char(przn + '0') + wynik;
   // else if(przn > 9) wynik = char(przn + 'A' - 10) + wynik;
    return wynik;
}
 
int main()
{
    string a="6543", b="432", c, pom;
    int p=7, d;
    // cout << "Podaj podstawe systemu: ";
    // cin >> p;
    // cout << "Podaj liczby: ";
    // cin >> a >> b;
    d = b.size()-1;
    for(int i = d; i>=0; i--)
    {
        pom = MnozPrzezCyfr(b[i], a, p);
        for(int j = 1; j <= d - i; j++) pom = pom + '0';
        c = Dodaj(c,pom,p);
    }
    cout << "Iloczyn: "<<c;
    return 0;
}

,ale czy to jest

bez przechodzenia na system dziesiętny i odwrotnie.

to nie wydaje mi się cyfra*cyfra tu chyba dziesiętny

Ale chyba prościej

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 2,857 wizyt
0 głosów
1 odpowiedź 2,092 wizyt
pytanie zadane 23 listopada 2015 w C i C++ przez Mateep Użytkownik (850 p.)
0 głosów
0 odpowiedzi 381 wizyt
pytanie zadane 10 stycznia 2020 w C i C++ przez Programmingc100 Bywalec (2,620 p.)

93,188 zapytań

142,204 odpowiedzi

322,027 komentarzy

62,515 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2581p. - dia-Chann
  2. 2537p. - Łukasz Piwowar
  3. 2528p. - Łukasz Eckert
  4. 2514p. - CC PL
  5. 2476p. - Tomasz Bielak
  6. 2445p. - Łukasz Siedlecki
  7. 2443p. - rucin93
  8. 2418p. - Michal Drewniak
  9. 2373p. - Marcin Putra
  10. 2367p. - Adrian Wieprzkowicz
  11. 2317p. - Mikbac
  12. 2156p. - Anonim 3619784
  13. 2016p. - Michał Telesz
  14. 1733p. - rafalszastok
  15. 1628p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...