Cod sursa(job #544783)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 2 martie 2011 09:25:14
Problema A+B Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>
#include <string.h>
FILE *f=fopen("adunare.in","r");
FILE *g=fopen("adunare.out","w");
char a[101],b[101];

void ogl(char *c){
	register int i=1,j=c[0];
	char aux;
	while(i<=j){
		aux=c[i];
		c[i]=c[j];
		c[j]=aux;
		i++;
		j--;
	}
}

void prelucrare(char *c){
	register int i,j;
	if(c[c[0]]=='-' || c[c[0]]=='+'){
		c[c[0]]=0;
		c[0]--;
	}
	for(i=1;i<=c[0];i++)
		c[i]-='0';
}

char comp(char *c,char *d){
	register char ch='a';
	if(c[0]>d[0])
		return 'a';
	if(d[0]>c[0])
		return 'b';
	for(register int i=c[0];i>=1;i++){
		if(c[i]<d[i]){
			return 'b';
		}	
		if(c[i]>d[i])
			return 'a';
	}
	return 'a';
}

void adunare(char *c,char *d){
	register int i,t=0;
	register int max=(c[0]>d[0]?c[0]:d[0]);
	for(i=1;i<=max;i++){
		c[i]+=d[i]+t;
		t=c[i]/10;
		c[i]%=10;	
	}
	c[0]=max;
	if(t!=0){
		c[0]++;
		c[c[0]]=t;
	}	
}

void scadere(char *c,char *d){
	register int i,t=0;
	for(i=1;i<=c[0];i++){
		c[i]-=d[i]+t;
		if(c[i]<0){
			c[i]+=10;
			t=1;
		}	
		else
			t=0;
	}
	while(c[c[0]]==0){
		c[0]--;
	}
}

void afisare(char *c){
	register int i;
	for(i=c[0];i>=1;i--)
		fprintf(g,"%d",c[i]);
}

int main(void){
	register int i;
	
	fscanf(f,"%s",a+1);
	a[0]=strlen(a+1);
	ogl(a);
	fscanf(f,"%s",b+1);
	b[0]=strlen(b+1);
	ogl(b);
	register char sgna ,sgnb;
	sgna=(a[a[0]]=='-'?'-':'+');
	sgnb=(b[b[0]]=='-'?'-':'+');
	prelucrare(a);
	prelucrare(b);
	if(sgna==sgnb){
		adunare(a,b);
		if(sgnb=='-')
			fprintf(g,"-");
		afisare(a);
	}
	else{
		if(comp(a,b)=='a'){
			scadere(a,b);
			if(sgna=='-')
				fprintf(g,"-");
			afisare(a);
		}	
		else{
			scadere(b,a);
			if(sgnb=='-')
				fprintf(g,"-");
			afisare(b);
		}
	}	
	fclose(f);
	fclose(g);
	return 0;
}