Cod sursa(job #296641)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 4 aprilie 2009 23:17:24
Problema Next Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <stdio.h>
#define N 1000005
#define D 17
int a[N],b[D],c[N],w[D],rest_zero;
long long d,r,t,salv,q,l_sir;
void citire()
{
	char x;
	while (scanf("%c",&x) && (int)x>=48)
		a[++r]=x-'0';
	scanf("%lld",&d);
	salv=d;
	while (d)
	{
		b[++t]=d%10;
		d/=10;
	}
	d=salv;
}
void inversare()
{
	long long i,p;
	for (i=r; i>=r/2+1; i--)
	{
		p=a[i];
		a[i]=a[r-i+1];
		a[r-i+1]=p;
	}
}
void adunare()
{
	long long i,min,max,j;
	int tr=0;
	if (r<t)
	{
		min=r;
		max=t;
	}
	else
	{
		min=t;
		max=r;
	}
	for (i=1; i<=min || tr; i++)
	{
		if (i<=min)
		{
			c[i]=(a[i]+b[i]+tr)%10;
			tr=(a[i]+b[i]+tr)/10;
		}
		if (min==r && i>min)
		{
			c[i]=(b[i]+tr)%10;
			tr=(b[i]+tr)/10;
		}
		if (min==t && i>min)
		{
			c[i]=(a[i]+tr)%10;
			tr=(a[i]+tr)/10;
		}
		if (tr==0 && i>=min && min==t)
		{
			for (j=i+1; j<=max; j++)
				c[j]=a[j];
		}
		if (tr==0 && i>=min && min==r)
		{
			for (j=i+1; j<=max; j++)
				c[j]=b[j];
		}
		if (i==max && tr)
		{
			c[++i]=1;
			max++;
		}
	}
	l_sir=max;
	/*for (i=1; i<=max; i++)
		printf("%d",c[i]);
	printf("\n");*/
}
void rest()
{
	long long i,rest=0,act;
	for (i=r; i>=1; i--)
		rest=(rest*10+a[i])%d;
	//printf("%lld",rest);
	if (rest==0)
		rest_zero++;
	act=rest;
	while (act)
	{
		w[++q]=act%10;
		act/=10;
	}
	
}
void scadere()
{
	long long i,j,poz,k,ok=0;
	for (i=1; i<=q; i++)
	{
		poz=i;
		if (c[i]>=w[i])
			c[i]=c[i]-w[i];
		else
		{
		//	printf("%lld\n",l_sir);
			for (j=poz+1; j<=l_sir; j++)
				if (c[j])
				{
					c[j]--;
					for (k=j-1; k>i; k--)
						c[i]=9;
					break;
				}
			c[i]=(10+c[i])-w[i];
		}
	}
	poz=0;
	for (j=l_sir; j>=1; j--)
		if (c[j]==0)
			poz++;
		else
			break;
	for (j=l_sir-poz; j>=1; j--)
		printf("%d",c[j]);
}
void afisare()
{
	long long i;
	for (i=r; i>=1; i--)
		printf("%d",a[i]);
}
int main()
{
	freopen("next.in","r",stdin);
	freopen("next.out","w",stdout);
	citire();
	inversare();
	adunare();
	rest();
	if (rest_zero==0)
		scadere();
	else
		afisare();
	return 0;
}