Cod sursa(job #37682)

Utilizator DranaXumAlexandru Dumitru Paunoiu DranaXum Data 25 martie 2007 11:52:32
Problema Next Scor 50
Compilator cpp Status done
Runda preONI 2007, Runda 4, Clasa a 9-a si gimnaziu Marime 1.64 kb
#include<stdio.h>
#include<string.h>

int a[1000000],b[1000000];
long dc;
long r;

int scadere(long d,long nc)
{
   long i;
   int ext=0,f=0;
   long t=d;
   for(i=nc;i>=1 && (d || f);i--)
   {
      if(a[i]-d%10-f<0)
      {
         a[i]=10+a[i]-d%10-f;
         f=1;
      }
      else
      {
         a[i]=a[i]-f-d%10;
         f=0;
      }
      if(d) dc++;
      d=d/10;
   }
   if(f || (nc==dc && d)) ext=1;
   d=t;
   if(ext==1)
      return 1;
   else
      return 2;
      
}

int rest(long nc,long d) {
   long i;
   long x=0;
   for(i=1;i<=dc;i++)
      x=x*10+a[i];
   r=x%d;
   if(dc<nc)
   {
      i=dc;
      while(i<nc){
         i++;
         x=r*10+a[i];
         r=x%d;
      }
   }
   if(r!=0)
   {
      return 1;
   }
   else return 0;   
}

void adunare(long d,long nc) 
{
   int t;
   long i;
   t=0;
   for(i=nc;i>=1 && (d || t);i--)
   {
      t+=d%10+b[i];
      b[i]=t%10;
      t/=10;
      d/=10;
   }
}

int main()
{
   long nc,i=0,ok=1;
   long d;
   char c;
   FILE *fin,*fout;
   fin=fopen("next.in","r");
   fout=fopen("next.out","w");
   while(ok)
   {
      fscanf(fin,"%c",&c);
      if(c=='\n') ok=0;
      else
      {i++; a[i]=c-'0';}
   }
   fscanf(fin,"%ld",&d);
   nc=i;
   memcpy(b,a,sizeof(a));
   int ret=scadere(d,nc);
   switch(ret)
   {
      case 1:
         fprintf(fout,"%ld",d);
         break;
      case 2:
         ret=rest(nc,d);
         if(ret==1){
         adunare(d-r,nc);}
         for(i=1;i<=nc;i++)
            fprintf(fout,"%d",b[i]);
         break;
   }
   fclose(fin);
   fclose(fout);
   return 0;
}