Cod sursa(job #320790)

Utilizator Abi79Iordache Albert Abi79 Data 5 iunie 2009 20:20:50
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#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;
}