Pagini recente » Cod sursa (job #2292591) | Cod sursa (job #1657929) | Cod sursa (job #1592099) | Cod sursa (job #966462) | Cod sursa (job #320790)
Cod sursa(job #320790)
#include<stdio.h>
#include<string.h>
FILE *in=fopen("next.in","r"),*out=fopen("next.out","w");
short int n[1000001],d[1000001],aux[1000001],b1[2]={1,1};
long int i;
char s1[1000001],s2[1000001];
void init(char S1[1000001],short int V1[1000001], char S2[1000001], short int V2[1000001])
{
for(i=1;i<=V1[0];)
{
V1[i]=(int)S1[V1[0]-i]-48;
V2[i]=(int)S2[V2[0]-i++]-48;
}
while(i<=V2[0])
V2[i]=(int)S2[V2[0]-i++]-48;
}
void Shl(short int v[1000001], unsigned int j)
{
memmove(&v[j+1],&v[1],sizeof(int)*v[0]);
memset(&v[1],0,sizeof(int)*j);
v[0]+=j;
}
int Sgn(short int a[1000001], short int b[1000001])
{
while(a[0] && !a[a[0]]) a[0]--;
while(b[0] && !b[b[0]]) b[0]--;
if(a[0]<b[0])
return -1;
else if (a[0]>b[0])
return 1;
for (int j = a[0];j;--j)
{
if(a[i]<b[i]) return -1;
else if (a[i]>b[i]) return 1;
}
return 0;
}
void Subtract(short int x[1000001],short int y[1000001])
{ int T=0;
for(i=y[0]+1;i<=x[0];) y[i++]=0;
for(i=1;i<=x[0];i++)
x[i]+= (T=(x[i]-=y[i]+T)<0) ? 10 : 0;
while(!x[x[0]]) x[0]--;
}
int impartire(short int a[1000001], short int b[1000001])
{
short int c[1000001], r[1000001];
r[0]=0; c[0]=a[0];
for(i=a[0];i;i--)
{
Shl(r,1); r[1]=a[i];
c[i]=0;
while(Sgn(b,r)!=1)
{
c[i]++;
Subtract(r,b);
}
}
if(r[0]) return 1;
else return 0;
}
void afis(short int a[1000001])
{
for(i=a[0];i;)
fprintf(out,"%d",a[i--]);
}
void adunare(short int a[1000001],short int b[2])
{
int T=0;
for(i=b[0]+1;i<=a[0];) b[i++]=0;
for(i=1;i<=a[0];i++)
{
a[i]=a[i]+b[i]+T;
T=a[i]/10;
a[i]=a[i]%10;
}
if (T) a[++a[0]]=T;
}
int main()
{
fscanf(in,"%s %s",&s1,&s2);
n[0]=strlen(s1); d[0]=strlen(s2);
if(n[0]>d[0])
init(s2,d,s1,n);
else
init(s1,n,s2,d);
while(1)
{
if(!impartire(n,d)) { afis(n); break; }
else adunare(n,b1);
}
fclose(out);
return 0;
}