Cod sursa(job #83744)

Utilizator coderninuHasna Robert coderninu Data 11 septembrie 2007 18:52:58
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#define infile "next.in"
#define outfile "next.out"
#define nmax 1000001

int n[nmax];
long long d, d2, i, rest;

void readdata();
void solve();
void writedata();

void add();

int main()
{
 readdata();
 solve();
 writedata();
 return 0;
}

void readdata()
{
 int temp;
 freopen(infile, "r", stdin);
 char c='a';
 while (1)
     {
      scanf("%c", &c);
      if (c>='0' && c<='9')
	  n[++n[0]]=c-'0';
      else break;
     }
 for (i=1; i<=n[0]/2; i++)
     {
      temp=n[i];
      n[i]=n[n[0]-i+1];
      n[n[0]-i+1]=temp;
     }
 scanf("%Lld", &d);
 fclose(stdin);
}

void add()
{
      long i, t = 0;
      for (i=1; i<=n[0] || d2 || t; i++, t/=10, d2/=10)
	      n[i] = (t += n[i] + d2%10) % 10;
      n[0] = i - 1;
}

int mod()
{
      long i, t = 0;
      for (i = n[0]; i > 0; i--)
	      t = (t * 10 + n[i]) % d;
      return t;
}

void sub()
{
      long i, t = 0;
      for (i = 1; i <= n[0]; i++, rest/=10)
	      n[i] += (t = (n[i] -= rest%10 + t) < 0) * 10;
      for (; n[0] > 1 && !n[n[0]]; n[0]--);
}

void solve()
{
 d2=d;
 add();
 rest=mod();
 sub();
}

void writedata()
{
 freopen(outfile, "w", stdout);
 for (i=n[0]; i>0; i--) printf("%d", n[i]);
 fclose(stdout);
}