Cod sursa(job #44676)

Utilizator mika17Mihai Alex Ionescu mika17 Data 31 martie 2007 17:04:41
Problema Next Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define fin "next.in"
#define fout "next.out"
#define NMAX 100002

int N[NMAX];
long long D;
FILE *f,*g;

void write(int A[])
{
 g = fopen(fout,"w");
 for ( int i = A[0] ; i ; --i)
     fprintf(g,"%d",A[i]);
 fclose(g);
}

void readData()
{
 f = fopen(fin,"r");
 char * s = (char*) malloc(NMAX+1);
 fgets(s,NMAX,f);
 N[0] = strlen(s) - 1;                //fara newline
 for ( int i = N[0] ; i ; --i)
    N[i] = s[N[0] - i] - '0';
 fscanf(f,"%lld",&D);
 fclose(f);
}

void attrib(int A[] , long long x)         // A = x
{
 do
 {
  A[++A[0]] = x % 10;
  x /= 10;
 }
 while(x);
}

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

void mod(int X[], long long &Y, long long &R)      // R = X % Y
{
 for ( int i = X[0] ; i ; --i )
    {
     R = R * 10 + X[i];
     while(R>=Y) R-=Y;
    }
}

int C1[NMAX];

void solve()
{
 long long r = 0;
 mod(N,D,r);
 if(r)
 {
  attrib(C1,D - r);
  add(N,C1);
 }
 write(N);
}

int main()
{
 readData();
 solve();
 return 0;
}