Cod sursa(job #257393)

Utilizator SheepBOYFelix Liviu SheepBOY Data 13 februarie 2009 10:44:26
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include<stdio.h>  
#include<string.h>  
struct GigaNumber  
{  
    int overflow;
	char number[200000];  
    void plus()  
    {  
        int i=0;
		int mrt=0;
		if(number[i]=='9')
		{			
			number[i]='0';
			mrt=1;
		}
		else
			++number[i];
        ++i;
		while(mrt)
        {  
			mrt=0;
			if(number[i]=='9')
			{
				number[i]='0';
				mrt=1;
			}
			else
			{
					if(i>=overflow)
				overflow=i+1;
				
				if(number[i])
				++number[i];
				else
					number[i]='1';
				break;
			}
			++i;  
			if(i>=overflow)
				overflow=i+1;
        }
    }  
};  
GigaNumber n; 
void mult(long long d)
{
	int j,i,k=0,next,a,b,ln;
	ln=n.overflow;
	char buffer[500000];
	strcpy(buffer,n.number);
	memset(n.number,48,sizeof(n.number));
	while(d)
	{
		b=d%10;
		next=0;
		if(b)
		for(i=k;i<ln+k;++i)
		{
			a=buffer[i-k]-48;
			a*=b;
			a+=next;
			a%=10;
			j=i;
				while(a&&j<n.overflow)
				{
					b=n.number[j]-48;
					a+=b;
					b=a%10;
					a/=10;
					n.number[j]=b+48;
					++j;
				}
				if(a)
				{
					n.number[n.overflow]=a+48;
					n.overflow;
				}
			
			next=a/10;
		}
		if(next)
		{
			n.number[n.overflow]=next;
			++n.overflow;
		}
		d/=10;
		++k;
		if(d)
		++n.overflow;
	}
}
void append_decomp(GigaNumber &v,long long a[],int na)
{
	int i;
	v.overflow=0;
	for(i=na-1;i>=0;--i)
	{
		while(a[i])
		{
			v.number[v.overflow++]=(a[i]%10)+48;
			a[i]/=10;
		}
	}
}
int imparte(GigaNumber &v,long long dp)  
{  
    int i=v.overflow-1,nr=0;	
    long long r,aux=0,a[10000];  
    while(i>0)  
    {  
        while(aux<dp)  
        {  
            aux=aux*10+v.number[i]-48;  
            --i;  
        }  
        r=aux%dp;  
        aux/=dp;
		a[nr++]=aux;
    }  
	append_decomp(v,a,nr);
}  
void outfile(GigaNumber a)  
{  
    for(int i=a.overflow-1;i>=0;--i)  
        printf("%c",a.number[i]);  
}  
int main()  
{  
    int nr=0,i;
	char aux;	
    long long dimprt=0;  
    freopen("next.in","r",stdin);  
    freopen("next.out","w",stdout);
	scanf("%c",&aux);	
    do
	{
		n.number[nr]=aux;
		++nr;
		scanf("%c",&aux);
	}
	while(aux!='\n');
	int st=0;
	int dr=nr-1;
	while(st<dr)
	{
		aux=n.number[st];
		n.number[st]=n.number[dr];
		n.number[dr]=aux;
		st++;
		dr--;
	}
	//gets(n.number);
	/*gets(buffer);  
    nr=strlen(buffer);  
    for(i=nr-1;i>=0;--i)  
    n.number[nr-i-1]=buffer[i]-48;  
    */
	n.overflow=nr;  
    scanf("%lld",&dimprt);  
    imparte(n,dimprt);  
	n.plus();  
	mult(dimprt);
    outfile(n);  
}