Pagini recente » Cod sursa (job #2392064) | Cod sursa (job #1305899) | Cod sursa (job #582190) | Cod sursa (job #1652063) | Cod sursa (job #296641)
Cod sursa(job #296641)
#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;
}