Cod sursa(job #67889)

Utilizator FlorianFlorian Marcu Florian Data 25 iunie 2007 19:44:49
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.17 kb
#include<stdio.h>
#include<string.h>
int a[2009],b[2009],n[2009],z[5000],ok=1;
char x[2009];
FILE*f=fopen("sarpe.in","r");
void read()
        {
        int i;
        fscanf(f,"%s",x);
        int p;
        p=strlen(x);
        if(p==1&&x[0]=='1') ok=0;
        for(i=0;i<p;++i)
                n[p-i]=x[i]-'0';
        n[0]=p;
        }
void formN()
        {
        int i,t=0,c;
        for(i=1;i<=n[0];++i)
                {
                c=n[i];
                n[i]=((4*n[i])+t)%10;
                t=(t+4*c)/10;
                }
        if(t>0) { n[0]++; n[n[0]]=t;}
        }
void formA()
        {
        int i,k,c;
        a[0]=n[0];
        k=1;
        int t=0;
        for(i=1;i<=a[0];++i)
                {
                if(n[i]-k-t<0)
                        {
                        a[i]=n[i]-k-t+10;
                        t=1;
                        }
                 else
                        {
                         a[i]=n[i]-k-t;
                         t=0;
                         }
                 k=0;
                 }
         if(t>0) a[--a[0]]=9;
     }
void formB()
        {
        int i,k,c;
        b[0]=n[0];
        k=2;
        int t=0;
        for(i=1;i<=b[0];++i)
                {
                if(n[i]-k-t<0)
                        {
                        b[i]=n[i]-k-t+10;
                        t=1;
                        }
                 else
                        {
                         b[i]=n[i]-k-t;
                         t=0;
                         }
                 k=0;
                 }
           if(t>0) b[--b[0]]=9;
     }
void inmultA()
        {
        int i,t=0,k=2,c;
        for(i=1;i<=a[0];++i)
                {
                c=a[i];
                a[i]=(a[i]*k+t)%10;
                t=(t+c*k)/10;
                }
       if(t>0) a[++a[0]]=t;
       }
void inmultire()
        {
        int j,i,t,c;
        for(i=1;i<=a[0];++i)
              {
              for(j=1;j<=b[0];++j)
                  z[i+j-1]+=(a[i]*b[j]);
              }
         t=0;
         for(i=1;i<=a[0]+b[0]-1;++i)
                {
                c=z[i];
                z[i]=(z[i]+t)%10;
                t=(c+t)/10;
                }
         if(t>0) { z[a[0]+b[0]]=t; z[0]=a[0]+b[0];}
         else z[0]=a[0]+b[0]-1;
         }
void add()
        {
        int c,t=0,i;
        if(n[0]>z[0]) { for(i=z[0]+1;i<=n[0];++i)  z[i]=0; z[0]=n[0];}
        else {for(i=n[0]+1;i<=z[0];++i) n[i]=0; n[0]=z[0];}
        for(i=1;i<=n[0];++i)
                {
                c=n[i];
                n[i]=(n[i]+z[i]+t)%10;
                t=(c+z[i]+t)/10;
                }
         if(t>0) n[++n[0]]=t;
         }
FILE*g=fopen("sarpe.out","w");
void afisare()
        {
        int i;
        for(i=n[0];i>=1;--i) fprintf(g,"%d",n[i]);
        }
int main()
        {
        read();
        if(ok==0) fprintf(g,"2");
        else{
        formA();
        formB();
        formN();
        inmultA();
        inmultire();
        add();
        afisare();
        }
        return 0;
        }