Cod sursa(job #697142)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 28 februarie 2012 22:30:02
Problema A+B Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<cstdio>
#include<cstring>
#include<algorithm>

#define N 10000

using namespace std;

char A[N];
int D[N];
int S[N];
int Rez[N];
int max(int a, int b) {
	if(a > b) return a;
	return b;
}
int main() {
	freopen("adunare.in","r",stdin);
	freopen("adunare.out","w",stdout);
	
	scanf("%s\n", &A);        			//citim primul termen ca string
	int lena = strlen(A);
	D[0] = lena;
	lena--;
	for(int i = lena; i >= 0; i--) 	   //punem cifrele in sirul D in ordinea inversa citirii(tinem numarul invers in memorie)
		D[lena - i + 1] = A[i] - '0';
	
	scanf("%s\n", &A);
	lena = strlen(A);				   //analog pentru al doilea termen
	S[0] = lena;
	lena--;
	for(int i = lena; i >= 0; i--) 
		S[lena - i + 1] = A[i] - '0';
	
	
	for(int i = 1; i <= max(D[0], S[0]); i++)
		Rez[i] = D[i] + S[i];
    
	//acum in vectorul Rez s-ar putea sa avem numere mai mari decat 9, efectuam transportul
	int dimRez = max(D[0], S[0]);
	int t = 0;
	int j;
	for(j = 1; j <= dimRez || t; j++) {
		int aux = t;                                  //folosim o variabila auxiliara ca sa memoram transportul cu care am ajuns pe poz j
		t = (aux + Rez[j]) / 10;                      //calculam noul transport, cel cu care vom pleca din poz j
		Rez[j] = (Rez[j] + aux) % 10;                 //calculam cifra de pe poz j pe baza transportului cu care am ajuns(memorat in aux)
	}
	while(Rez[j] == 0) j--;                           //eliminam cifrele de 0 de la inceputul numarului
	for(int k = j; k > 0; k--)
		printf("%d",Rez[k]);
	printf("\n");
	return 0;
}