dodawanie w systemie trójkowym

0

Witam, piszę program, który ma z pliku pobrać 2 liczby w systemie trójkowym (l1 i l2) dodać je i wypisać sumę. Liczby są na tyle długie, że muszę używać typu string. tworzę trzecią zmienną, która ma przechowywać wynik (docelowo będę musiał to wpisać do pliku) i ma dlugość o 1 większą od dłuższego wyrazu który dodaje. wiem jak to logicznie powinno przebiegac, umiem dodawac pisemnie w trójkowym, ale nie wiem czemu to nie działa. Prosze o pomoc.

 
    ifstream plik("pary_2.txt");
	string l1;
	string l2;
	plik>>l1;
	plik>>l2;
	int dlugosc;
	
	if(l1.length()>l2.length()) {dlugosc=l1.length()+1;}
	else {dlugosc=l2.length()+1;}
	char nowy[dlugosc];
	
	
	int i1=l1.length()-1;    //indeksy 
	int i2=l2.length()-1;
	int in=dlugosc-1;
	int n=0;                    //zmienna ktora bedzie przechowywac obliczana sume, ktora bedzie trzeba wpisac do zmiennej "nowy"
	
	
	while(in>=0)  // petla ktora ma dodawac
	{
		if (i1>=0) n+=(int)l1[i1]-48;  //dodaje ostatnie cyfry 
		if (i2>=0) n+=(int)l2[i2]-48;
		nowy[in]=n%3;                   //na ostatnim miejscu zostawia reszte z dzielenia
		n=n/3;                              // to jest to co przenosi dalej, na kolejne miejsca
		i1--;
		i2--;
		in--;
	}
	
	for(int i=0;i<dlugosc;i++)
	{
		cout<<nowy[i];
	}
1

Nie lepiej by było jakbyś odwrócił liczby kolejnością. Wtedy miałbyś kolejne wartości tych samych wag pod tymi samymi indeksami. Wtedy ten sami indeks by był dla l1 l2 i nowy.
Ja bym napisał funkcję odwracającą kolejność stringa, utworzył stringa z wynikiem, dodał wszystko i odwrócił stringa z wynikiem i go wyświetlił.

0

dzięki, spróbuję tak zrobić.

edit:

ifstream plik("pary_2.txt");
	ofstream wyj("wynik_2.txt");
	string l1;
	string l2;
	plik>>l1;
	plik>>l2;
	int dlugosc;
	
	if(l1.length()>l2.length()) {dlugosc=l1.length()+1;}
	else {dlugosc=l2.length()+1;}
	char nowy[dlugosc];
	l1=odwroc(l1);
	l2=odwroc(l2);
	int i=0;
	int n=0;
	while(i<dlugosc)
	{
		if (i<l1.length()) n+=(int)l1[i]-48;
		if (i<l2.length()) n+=(int)l2[i]-48;
		nowy[i]=n%3;
		n=n/3;
		i++;
	}

mam funkcje odwroc(), ktora odwraca string. Obliczyem sumę i zanim znów to odwróciłem, sprawdziłem wynik przez cout i dostaję jakieś dziwne znaki, nie to co chciałem i nie wiem z czego to wynika. Teraz rzeczywiście samo dodawanie jest dużo prostrze ale nadal nie wiem czemu coś jest nie tak. :/

edit2:
Ustaliłem że jak w pętli za każdym razem wypisuję cyfrę to działa, nie działa jedynie jeśli chcę wypisać "nowy", więc chyba już sobie z tym poradzę, dziękuję :)

1

Nie wiem czemu ale jak deklarujesz tablice char to czasami musisz ją wyzerować - czyli wpisać w każdy element '\0' - wtedy taki problem dziwnych znaków nie występuje. Myślałem że zrobisz wynik w stringu a potem go odwrócisz. Tak jest prościej.

0

heh, taa, dopiero sie dowiedziałem o paru rzeczach i zmieniłem na string, o tym wyzerowaniu to wgl nie miałem pojęcia, dzięki bardzo, spróbuje coś tam pogrzebać :)

2

Nie widzę całego kodu, ale strzelam, że to przez to, że nie zamieniasz liczb z powrotem na ascii.

nowy[i]= ( n % 3 ) + '0'; 

Powinno załatwoć sprawę.

Poza tym:

 
char nowy[dlugosc];

tak się nie robi. Czemu nowy nie jest stringiem i nie robisz po prostu

nowy += static_cast<char>( ( n % 3 ) + '0' ); 

?

I tak wgl istniej std::reverse :p Zaoszczędziła by Ci czasu trochę

0

O rety, o czymś takim jak std::reverse nie słyszałem, ale już sobie czytam, dzięki :D
rzeczywiście nie wiem czemu miałem tam wcześniej char[] zamiast string ale juz naprawione wszystko i chyba będę wiedział już .
Dziękuję.

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