Cod sursa(job #83930)

Utilizator coderninuHasna Robert coderninu Data 12 septembrie 2007 17:31:48
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>
#define infile "next.in"
#define outfile "next.out"
#define nmax 1000001

int n[nmax], d[17], n2[nmax];
long i, d0, n0, n20;

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

void add();
int mai_mare();
void sub2();

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[++n0]=c-'0';
      else break;
     }
 for (i=1; i<=n0/2; i++)
     {
      temp=n[i];
      n[i]=n[n0-i+1];
      n2[i]=n[i];
      n[n0-i+1]=temp;
      n2[n0-i+1]=temp;
     }
 n20=n0;
 c='a';
 while (1)
     {
      scanf("%c", &c);
      if (c>='0' && c<='9')
	  d[++d0]=c-'0';
      else break;
     }
 for (i=1; i<=d0/2; i++)
     {
      temp=d[i];
      d[i]=d[d0-i+1];
      d[d0-i+1]=temp;
     }
 fclose(stdin);
}

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

void mod()
{
 while (mai_mare())
     sub2();
}

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

void sub2()
{
      long i, t = 0;
      for (i = 1; i <= n20; i++)
	      n2[i] += (t = (n2[i] -= d[i] + t) < 0) * 10;
      for (; n20 > 1 && !n2[n20]; n20--);
}

void solve()
{
 add();
 mod();
 sub();
}

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

int mai_mare()
{
 if (n20>d0) return 1;
 if (n20<d0) return 0;
 for (long i=n20; i>0; i--)
     if (n2[i]<d[i])
	 return 0;
 return 1;
}