Cod sursa(job #1781252)

Utilizator andreinichitaTirziu Nichita andreinichita Data 16 octombrie 2016 19:26:24
Problema Next Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_DIGITS=1000000;
char s[MAX_DIGITS+5];
class HugeN
{
private:
    int x[MAX_DIGITS+5];
public:
	HugeN()
	{
		x[0]=1;
		for(int i=1;i<=MAX_DIGITS;i++)
			x[i]=0;
	}
	HugeN(long long nr)
	{
		for(int i=0;i<=MAX_DIGITS;i++)
			x[i]=0;
		do{
			x[++x[0]]=nr%10;
			nr=nr/10;
		}
		while(nr);
	}
	HugeN(HugeN&other)
	{
		x[0]=1;
		for(int i=1;i<=MAX_DIGITS;i++)
			x[i]=0;
			memcpy(x,other.x,sizeof(other.x));
	}
	HugeN(char *s)
	{
		x[0]=strlen(s);
		for(int i=1;i<=x[0];i++)
			x[i]=s[x[0]-i]-'0';
	}
    void print()
    {
        int i;
        for(i=x[0]; i>=1; i--)
            printf("%d",x[i]);
        printf("\n");
    }
    HugeN operator+=(long long k);
    long long operator%(long long k);
};
long long HugeN::operator%(long long k)
{
	int i;
	long long r=0;
	for(i=x[0];i>=1;i--)
		r=(r*10+x[i])%k;
		return r;
}
HugeN HugeN::operator+=(long long k)
{
	int i,tr=0,aux=0,c;
	i=1;
	do{
		c=k%10;
		aux++;
		x[i]=c+x[i];
		k=k/10;
		i++;
	}
	while(k);
	x[0]=max(x[0],aux);
	for(i=1;i<=x[0];i++)
	{
		aux=x[i]+tr;
		x[i]=aux%10;
		tr=aux/10;
	}
	while(tr)
	{
		x[++x[0]]=tr%10;
		tr=tr/10;
	}
	return *this;
}
/*HugeN HugeN::operator+=(long long k)
{
	//HugeN other(k);
	//x[0]=x[0]>other.x[0]?x[0]:other.x[0];
	int tr=0,aux,i;
	for(i=1;i<=x[0];i++)
	{
		aux=x[i]+k%10+tr;
		x[i]=aux%10;
		tr=aux/10;
		k=k/10;
	}
	if(tr)
		x[++x[0]]=tr;
	return *this;
}*/
int main()
{
	  freopen("next.in","r",stdin);
	  freopen("next.out","w",stdout);
    gets(s);
    long long k;
    scanf("%lld",&k);
    HugeN n(s);
    long long r;
    r=n%k;
    if(r==0)
			n.print();
		else
		{
			k=k-r;
			n+=k;
			n.print();
		}
    return 0;
}