Cod sursa(job #61125)

Utilizator znakeuJurba Andrei znakeu Data 18 mai 2007 13:41:28
Problema Secventa Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <stdio.h>
#include <string.h>

void add(int A[], int B[])  
{  
    int i, t = 0;  
    for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)  
            A[i] = (t += A[i] + B[i]) % 10;  
    A[0] = i - 1;  
}  

void mul(int A[], int B[])  
{  
    int i, j, t, C[50];  
    memset(C, 0, sizeof(C));  
    for (i = 1; i <= A[0]; i++)  
    {  
            for (t=0, j=1; j <= B[0] || t; j++, t/=10)  
                    C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;  
            if (i + j - 2 > C[0]) C[0] = i + j - 2;  
    }  
    memcpy(A, C, sizeof(C));  
}

void div(int A[], int B)  
{  
    int i, t = 0;  
    for (i = A[0]; i > 0; i--, t %= B)  
            A[i] = (t = t * 10 + A[i]) / B;  
   for (; A[0] > 1 && !A[A[0]]; A[0]--);  
}  

void invert (int A[])
{
	int i = 0,t = 0;
	for (i = 1; i <= A[0] / 2; i++)
	{
		t = A[i];
		A[i] = A[ A[0] - i + 1 ];
		A[ A[0] - i + 1 ] = t;
	}
}

void copy (int A[],int B[])
{
	int i = 0;
	memset(A,0,sizeof(A));
	for (i=0; i<=B[0]; i++)
		A[i]=B[i];	
}

int main()
{
	int A[50],B[50],C[50],D[50],i;
	char c;
	for (i=0; i<31; i++)
	{
		A[i]=0; B[i]=0; C[i]=0;
	}
	
	FILE *in=fopen("tort.in","r");
	fscanf(in,"%c",&c);
	while (c!=' ')
	{
		A[++A[0]]=c-'0';
		fscanf(in,"%c",&c);
	}
	fscanf(in,"%c",&c);
	while (c!=10)
	{
		B[++B[0]]=c-'0';
		fscanf(in,"%c",&c);
	}
	fclose(in);
	
	invert(A);
	invert(B);
	

	
	C[0]=1; C[1]=1;
	if (!(A[0]==1 && A[1]==0) && !(B[0]==1 && B[1]==0) )
	{
		copy(D,A);
		C[0]=1; C[1]=1;
		add(B,C);
		mul(D,B);
		
		add(A,C);
		
		copy (C,B);
		mul(B,B);
		add(B,C);
		div(B,2);
		mul(B,A);
		
		copy (A,D);
		add(A,B);		
	}
	else
	{
		if (!(A[0]==1 && A[1]==0) && (B[0]==1 && B[1]==0))
		{
			C[0]=1; C[1]=1;
			add(A,C);
			copy(C,A);
			mul(A,A);
			add(A,C);
			div(A,2);
		}
		if ((A[0]==1 && A[1]==0) && !(B[0]==1 && B[1]==0))
		{
			C[0]=1; C[1]=1;
			add(B,C);
			copy(C,B);
			mul(B,B);
			add(B,C);
			div(B,2);
			copy(A,B);
		}
		if ((A[0]==1 && A[1]==0) && (B[0]==1 && B[1]==0))
			A[1]=1;
	}
	
	FILE *out=fopen("tort.out","w");
	for (i=A[0]; i>0; i--)
		fprintf(out,"%d",A[i]);
	fprintf(out,"\n");
	fclose(out);
	return 0;
}