Cod sursa(job #115567)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 16 decembrie 2007 12:59:00
Problema Multiplu Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 2, Clasele 11-12 Marime 1.38 kb
#include <string.h>
#include <stdio.h>
int* mul(int A[], int B[])
{
      int i, j, t, C[1000];
      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));
      return A;
}   

int* trans(int A[],long a)
{int i=1;
 while(a)
 {A[i]=a%10;
  a/=10;i++;
 }
 A[0]=i-1;
 return A;
}
int test(int C[])
{int sw=1,i;
 for (i=1;i<=C[0];i++)
 {if(C[i]!=0&&C[i]!=1){sw=0;break;}
 }
 return sw;
}
int main ()
{FILE *f,*ff;
 f=fopen("multiplu.in","r");
 ff=fopen("multiplu.out","w");
 long a,b,i;

 int A[1000],B[1000],C[1000];
 int r[20]={0,0,5,7,5,2,5,3,5,9};
 fscanf(f,"%ld %ld",&a,&b);
 mul(trans(A,a),trans(B,b));
 if(A[1]==0)
 {i=1; 
  while(!test(mul(trans(A,a),mul(trans(B,b),trans(C,i)))))
  {i++;}
  for (i=1;i<=A[0];i++)
  {fprintf(ff,"%d",A[i]);fclose(ff);return 0;
  }
 }
 
 else if(A[1]==1)
 {i=1; 
  while(!test(mul(trans(A,a),mul(trans(B,b),trans(C,i)))))
  {if(i%10==1){i+=9;}
   else i++;
  }
  for (i=1;i<=A[0];i++)
  {fprintf(ff,"%d",A[i]);fclose(ff);return 0;
  }
 }
 else
 {i=r[A[1]];
  while(!test(mul(trans(A,a),mul(trans(B,b),trans(C,i)))))
  {i+=10;
  }
  for (i=1;i<=A[0];i++)
  {fprintf(ff,"%d",A[i]);fclose(ff);return 0;
  }
 }

 }