Sumowanie - klasa do dużych liczb

0

Piszę własną klasę do obsługi b. dużych liczb i mam funkcję:

vlong vlong::operator +( vlong& v ) {
	vlong ret;
	size_t s = ( size < v.size ? size : v.size );
	ret.size = ( size > v.size ? size : v.size );
	int diff = 0;
	size_t i = 0;
	for( ; i < s; i++ ) {
		ret.tab[i] = ( tab[i] + v.tab[i] + diff ) % 10;
		diff = ret.tab[i] / 10;
	}
	if( size > v.size )
		for( ; i < ret.size; i++ ) {
			ret.tab[i] = tab[i] + diff % 10;
			diff = tab[i] + diff / 10;
		}
	else
		for( ; i < ret.size; i++ ) {
			ret.tab[i] = v.tab[i] + diff % 10;
			diff = tab[i] + diff / 10;
		}
	if( diff > 0 ) {
		ret.tab[i] = diff;
		ret.size++;
	}
	return ret;
}

i w kodzie:

vlong v = 1;
	vlong b = 1234567 ;
	vlong n = v + b;

	cout << n;

i na wyjściu wywala mi:
22-312-2-10

PS
Wiem, że jest biblioteka vlong, ale to jest moje przygotowanie na olimpiadę, a dochodząc samemu do tego jak to działa najlepiej jest mi to zapamiętać.

0

Źle sumujesz cyfry. Przeniesieniu przypisałeś iloraz reszty z dzielenia sumy (zawsze 0), a powinieneś przypisać iloraz sumy. Tak to powinno wyglądać:

diff += tab[i] + v.tab[i];
ret.tab[i] = diff % 10;
diff /= 10;

Dla przyspieszenia i ułatwienia algorytmu warto sobie zdefiniować 3 wskaźniki:
longTab - współczynniki liczby dłuższej
shortTab - współczynniki liczby krótszej
retTab - współczynniki wyniku
Na nich operuj.

ret.size = ...
Nie widzę nigdzie realokacji pamięci. Tablica vlong.tab ma stały rozmiar ? :| bez sensu. Może dziedzicz prywatnie po std::vector.

Natomiast skąd się te pauzy wzięły to nie wiem, gdzie indziej coś jest nie tak. Przy wyświetlaniu? Kopiowaniu?

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