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

C++ dodawanie pisemne

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
1,019 wizyt
pytanie zadane 3 lutego 2020 w C i C++ przez minemoney123 Nowicjusz (140 p.)
#include <vector>
#include <iostream>
#include <string>
using namespace std;

string add(pair<string, string> p, int index, int previousremainder, const string &returnstr)
{
	string a = p.first;
	string b = p.second;
	string ret = returnstr;
	
	/*cout << "\n-------------\n";
	cout << index << endl;
	cout << ret << endl;*/
	//cout << "----------------\n";
	//cout << previousremainder << endl;;
	

	
	int x = a[a.size() - index-1]-48;
	//cout << x << endl;
	//cout << "  " << a.size() << endl << a.size() - index << endl;
	int y = b[b.size() - index-1]-48;
	//cout << y << endl;
	//cout << "   " << b.size() << endl<< b.size() - index<<endl;
	int sum = x + y + previousremainder;
	//cout << sum << endl;
	int thisposnum = sum % 10;
	//cout << thisposnum << endl;
	int remainder = sum / 10;
	//cout << remainder << endl;
	string addd = to_string(thisposnum);
	//cout << addd << endl;
	ret = addd + ret;
	//cout << ret << endl;
	if (a.size() - index - 1 == 0)
	{
		if (remainder !=0) 
		{ 
			ret = to_string(remainder) + ret; 
		}
		return ret;
	}
	else
	{
		add(p, index + 1, remainder, ret);
	}
	
}

int main()
{
	vector<pair<string, string> > vec;
	int t;
	cin >> t;
	for (int i = 0; i < t; i++)
	{
		string a, b;
		cin >> a >> b;
		pair<string, string> temp;
		temp.first = a;
		temp.second = b;
		vec.push_back(temp);
	}


	for (int i = 0; i < vec.size(); i++)
	{
		string a = vec[i].first;
		string b = vec[i].second;
		if (a.size() < b.size())
		{
			while (a.size() != b.size())
			{
				a = "0" + a;
			}
		}
		else if (b.size() < a.size())
		{
			while (a.size() != b.size())
			{
				b = "0" + b;
			}
		}

		cout << a << "   " << b << "  =   ";
		vec[i].first = a;
		vec[i].second = b;
		cout << add(vec[i], 0, 0, "") << endl;;
	}
	
	return 0;
}

Kod ma dodawać pisemnie 2 liczby, dla jednocyfrowych wynik jest dobry i nie ma żadnego błędu, gdy wprowadzam jakąś liczbę dwu albo więcej cyfrową to wygląda na to że liczy dobrze, tylko pod koniec dostaje taki oto błąd i wszystko się wyspuje

Zgłoszono nieobsługiwany wyjątek: naruszenie dostępu do odczytu.
**std::_String_alloc<std::_String_base_types<char,std::allocator<char> > >::_Get_data**(...) zwrócił 0xCCCCCCCC.: wystąpił wyjątek 

Próbowałem chwilę coś z tym zrobić i skończyły mi się pomysły, a nie mam zielonego pojęcia co ten błąd może oznaczać i co z tym zrobić sad

2 odpowiedzi

0 głosów
odpowiedź 4 lutego 2020 przez adrian17 Mentor (350,120 p.)

Zapewne ma związek z tym ostrzeżeniem kompilatora. Nie dostajesz takiego?

main.cpp: In function ‘std::string add(std::pair<std::string, std::string>, int, int, const string&)’:
main.cpp:49:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

 

0 głosów
odpowiedź 4 lutego 2020 przez j23 Mędrzec (195,220 p.)
edycja 4 lutego 2020 przez j23

Po co ta rekurencja?

int add(const std::string &a, const std::string &b)
{
    auto ia = a.rbegin();
    auto ib = b.rbegin();
    bool carry = false;
    int shift = 1;
    int acc = 0;
    
    while (ia != a.rend() || ib != b.rend()) {
        int v = 0;
    
        if (ia != a.rend()) {
            v = *ia++ - '0';
        }

        if (ib != b.rend()) {
            v += *ib++ - '0';
        }
        if (carry) ++v;
        
        if (v > 9) {
            v %= 10;
            carry = true;
        } else {
            carry = false;
        }
        
        acc += v * shift;
        shift *= 10;
    }
    
    if (carry) {
       acc += 1 * shift;
    }
    
    return acc;
}

 

Podobne pytania

0 głosów
1 odpowiedź 1,758 wizyt
pytanie zadane 16 października 2017 w C i C++ przez kosttek Początkujący (450 p.)
+1 głos
4 odpowiedzi 2,630 wizyt
pytanie zadane 15 stycznia 2019 w C i C++ przez Michał Wojtaś Obywatel (1,080 p.)
0 głosów
5 odpowiedzi 1,586 wizyt
pytanie zadane 6 października 2016 w C i C++ przez nodo12221 Obywatel (1,100 p.)

93,097 zapytań

142,060 odpowiedzi

321,514 komentarzy

62,441 pasjonatów

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!

...