Sumowanie dużych liczb naturalnych - dziwne zachowanie

0

Dzień dobry, od jakiegoś czasu próbuję napisać program do sumowania liczb naturalnych, przy użyciu tablic.
Generalnie zadanie udało mi się wykonać i wszystko wydawało się być w porządku, dopóki sprawdzałem go w Visual Studio 2015.

Natomiast w code blocks i na ideone po wprowadzeniu danych ostatnia cyfra jest zwiększana o 1, z niewiadomego mi powodu. Bardzo bym prosił kogoś aby mnie troszeczkę oświecił.

Pozdrawiam.

#include <iostream>
#include <string>

using namespace std;


string liczba1;
string liczba2;
string bufor1;
int bufor2;
int testy;


int main()
{

    cin >> testy;

    for (int i = 0; i < testy; i++)
    {


        cin >> liczba1;
        cin >> liczba2;


        int length1 = liczba1.length();
        int length2 = liczba2.length();

        if (length2 > length1)
        {
            bufor1 = liczba1;
            liczba1 = liczba2;
            liczba2 = bufor1;

            bufor2 = length1;
            length1 = length2;
            length2 = bufor2;
        }

        int* suma;
        suma = new int[length1];

        for (int i = 0; i < length2; i++)
        {
            suma[length1 - 1 - i] = liczba1[length1 - 1 - i] - 48 + liczba2[length2 - 1 - i] - 48;
        }


        if (length2 < length1)
            for (int i = 0; i < length1 - length2; i++)
            {
                suma[length1 - 1 - length2 - i] = liczba1[length1 - 1 - length2 - i] - 48;
            }


        for (int i = length1; i > 0; i--)
        {
            if (suma[i] > 9)
            {
                suma[i] = suma[i] - 10;
                suma[i - 1] = suma[i - 1] + 1;
            }
        }


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


        delete[] suma;
    }


    return 0;
}
0

Nie wiem ja sprawdzałeś go w tym VS ale masz błąd logiczny. Popatrz na to co napisałeś:

 for (int i = length1; i > 0; i--)
        for (int i = 0; i < length1; i++)
0

Źle zaczynasz jedną pętlę for.
Pamiętaj, że zaczynasz tablice od 0, a nie od 1

0

Znalazłem błąd.

W tej pętli odwołuję się do indeksu tablicy suma[], który jest poza jej zakresem.

 

		cout << suma[length1] << endl;
	for (int i = length1; i > 0; i--)
		{

			if (suma[i] > 9)
			{
				suma[i] = suma[i] - 10;
				suma[i - 1] = suma[i - 1] + 1;
			}
		}


Powinno być

 

		cout << suma[length1] << endl;
	for (int i = length1-1; i > 0; i--)
		{

			if (suma[i] > 9)
			{
				suma[i] = suma[i] - 10;
				suma[i - 1] = suma[i - 1] + 1;
			}
		}


W przypadku visual studio program działał prawidłowo, bo akurat w tych indeksach były liczby ujemne i nie spełniał się warunek:

 
if (suma[i] > 9)
			{
				suma[i] = suma[i] - 10;
				suma[i - 1] = suma[i - 1] + 1;
			}


W innych kompilatorach suma była dodatnia i stąd brała się ta dodatkowa jedynka.

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