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.