Dodawanie pisemne na stringach w c++

0

Witajcie jestem nowy jest to mój pierwszy wątek zatem proszę uprzejmie o wyrozumiałość. Mam zagadnienie w środku którego utknąłem część z Was uzna że jest to zapewne błahostka, ale do meritum mam napisać prostą aplikacje w C++ która będzie dodawać pisemnie duże liczby na bazie stringów, mam taki kod i dalej nie wiem co z nim począć:

#include <iostream>
using namespace std;

int main()
{
	string a, b;
	cin >> a >> b;
	int wynik[1005];
	int suma;
	int dlugosc = a.length();
	int wpamieci = 0;

	for (int i = dlugosc - 1; i >= 0; i--)
	{
		suma = (a[i] - '0') + (b[i] - '0') + wpamieci;

		wynik[i] = suma % 10;

		cout << (a[i] -'0')+(b[i] - '0')+ wpamieci << endl;

		if (suma >= 10) wpamieci=1;

        cout << ((a[i] -'0')+(b[i] - '0')-10) << endl;

	}

    for (int i=0;i<=0;i++){
        cout << wynik[i] << endl;
    }

    return 0;
}

Proszę Was wszystkich specjalistów o pomoc :)

2

Z czym dokładnie masz problem? Co działa? Co nie działa? Czego oczekujesz a co otrzymujesz? Co próbowałeś do tej pory?

0

Na wejściu mają być dwie liczby 9999 oraz 9993 które wiadomo na wyjściu mają dać sumę 19992, takie są dane wejściowe i wyjściowe. Ja działałem na dużo mniejszych liczbach np. na 24 i 17. W przypadku tych liczb pętla wykonuje się 2 razy w bo jest to liczba 2-cyfrowa (dla liczby która ma n cyfr wykona się n razy) zapomniałem wcześniej dodać że warunkiem działania tego dodawania jest to że obie cyfry muszą mieć tyle samo liczb tzn jedna ma być 4 cyfrowa i druga też 4 cyfrowa. Instrukcję w pętli napisałem tak aby dodawała liczby od końca czyli od prawej do lewej (tak jak jest to w przypadku zwykłego liczenia pisemnego na kartce inaczej mówi się na to liczenie w słupku). Niby mi je dodaje bo wpisując 24 i 17 z 24 bierze 4 i z 17 zabiera 7 i dodaje jest to 11, okej to działa ale wiadomo w dodawaniu pisemnym sumę która jest większa od 10 trzeba przenieść do następnego słupka a w nim dodać wartość 1 i to też działa, co dalej z wyżej wspomnianego dodawania 4+7 =11 nie wiem jak pozbyć się tej zbędnej wartości 10 którą przecież przenoszę do następnego słupka aby w pierwszym słupku pozostało 1 a w drugim 4 otrzymując tym samym wynik 41 którego też już nie mam pojęcia w jaki sposób zapisać aby został poprawnie wyświetlony w konsoli

1

Blisko byłeś :), musisz tylko pamiętać o carry na końcu dodawania, (w razie potrzeby doczepiamy jeden do wyniku), dlatego w pętli jest wynik[i+1] - w indeksie zerowym zostaje miejsce. Te cuda są dlatego, że wybrałeś toporną strukturę danych - tablicę.

#include <iostream>

using namespace std;

int main()
{
    string a, b;
    cin >> a >> b;
    int wynik[1005];
    int suma;
    int dlugosc = a.length();
    int wpamieci = 0;

    for (int i = dlugosc - 1; i >= 0; i--)
    {
        suma = ((a[i] - '0') + (b[i] - '0') + wpamieci);
        wynik[i+1] = suma % 10;
        wpamieci = suma / 10;

    }
    if (wpamieci > 0)
      wynik[0] = wpamieci;

    for (int i=0;i< a.length() + 1;i++){
       cout << wynik[i] << "";
    }
   cout << endl;

    return 0;
}
1

Kilka sztuczek:

  • Liczby warto trzymać w pamięci "wspak" czyli np. 1773 jako "3771". Wtedy dodawanie, przeniesienia i ewentualne zwiększenie liczby cyfr (np. 9 + 9) nie będzie bolesne.
  • Czasami można użyć diabelskiej sztuczki jeżeli mamy do dodania np. 100 liczb. Zamiast liczyć przeniesienie za każdym razem po prostu dodajemy bez przeniesienia. Jest to poprawne tak długo dopóki suma cyfr mieści się w pojedynczym bajcie (255). Można więc np. sumować 10 liczb (10*9 < 255) bez dbania o przeniesienia a dopiero na końcu poobliczać przeniesienia tylko raz (operacje % i / są ciężkie)
  • Jeżeli obliczenia prowadzone są na liczbach o stałej długości to podobnie jak w kodzie binarnym odejmowanie można robić dodając uzupełnienie do 10 np. 7 - 3 = 7 + (10 - 3) = 14 = 4 (mod 10)

Ale pewnie nie będziesz potrzebował takich sztuczek...

2

Powinno być coś w okolicach tego:

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

int main()
{
    string a,b,c;
    cin>>a>>b;
    int curry=0,asize=a.length()-1,bsize=b.length()-1;
    c.reserve(max(asize,bsize)+1);
    while((asize>=0)||(bsize>=0))
    {
    	int avalue=(asize>=0?a[asize--]-'0':0);
    	int bvalue=(bsize>=0?b[bsize--]-'0':0);
        int sum=avalue+bvalue+curry;
        curry=(sum>=10);
        if(curry) sum-=10;
        c.insert(c.begin(),sum+'0');
    }
    if(curry>0) c.insert(c.begin(),'1');
    cout<<c<<endl;
    return 0;
}

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