Cod sursa(job #208754)

Utilizator tamicTamas Iulia tamic Data 18 septembrie 2008 10:42:29
Problema Sarpe Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#include <string.h>

FILE *fin,*fout;
int a[4001],b[4001],c[4001],x[2];
int i,n,aux;
char s[1001];

void adunare(int a[4001], int b[4001]){
	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[4001], int b[4001]){
	int i,j,t,c[4001];
   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 mul_mic(int a[4001], int b){
	int i,t=0;
   for(i=1;i<=a[0] || t;i++, t /= 10)
   	a[i]=(t += a[i]*b) %10;
   a[0]=i-1;
}

void sub(int a[4001], int b){
	int i,t=-b;
   for(i=1;i<=a[0];i++){
   	a[i] +=10+t;
      t=a[i]/10;
      a[i+1]--;
      a[i]=a[i]%10;
   }
   if(a[a[0]+1]<0) a[a[0]+1]=0;
   for(;a[0]>1 && !a[a[0]]; a[0]--);
}

int main(){
	fin=fopen("sarpe.in","r");
   fout=fopen("sarpe.out","w");
   fscanf(fin,"%s\n",&s);
   n=strlen(s);
   for(i=0;i<n;i++) a[i+1]=s[i]-'0';
   for(i=1;i<=n/2;i++) {aux=a[i]; a[i]=a[n-i+1]; a[n-i+1]=aux; }
   for(i=1;i<=n;i++) { b[i]=a[i]; c[i]=a[i]; }
   a[0]=strlen(s); b[0]=a[0]; c[0]=a[0];
   x[1]=1;
   sub(b,1);
   x[1]=2;
   sub(c,2);
   mul_mic(b,2);
   mul(b,c);
   mul_mic(a,4);
   adunare(a,b);
   for(i=a[0];i>=1;i--) fprintf(fout,"%d",a[i]);
   fprintf(fout,"\n");
   fclose(fin); fclose(fout);
   return 0;
}