Cod sursa(job #1747843)

Utilizator cyg_LucaFlorinTanasescu Luca Florin cyg_LucaFlorin Data 25 august 2016 17:54:10
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define NMAX (1 << 15)

class HugeN
{
    private:
        int x[NMAX];
    public: HugeN();
            HugeN(int nr);
            HugeN(HugeN & other);
            void get_huge();
            HugeN&operator+(int k);
            HugeN&operator+(const HugeN&other);
            HugeN&operator-(const HugeN&other);
            int&operator%(int k);
    private:
        int max(int a,int b)
            {
                return a>b?a:b;
            }
};
HugeN::HugeN()
{
    memset(x,0,sizeof(x));
    x[0]=1;
}
HugeN::HugeN(int nr)
{
    memset(x,0,sizeof(x));
    do
        {
            x[++x[0]]=nr%10;
            nr=nr/10;
        }while(nr);
}
HugeN::HugeN(HugeN&other)
{
    memset(x,0,sizeof(x));
    for(int i=0;i<=other.x[0];i++)
        x[i]=other.x[i];
}
HugeN&HugeN::operator+(const HugeN&other)
{
    HugeN temp;
    int tr,i,aux;
    tr=0;
    temp.x[0]=max(x[0],other.x[0]);
    for(i=1;i<=temp.x[0];i++)
        {
            aux=x[i]+other.x[i]+tr;
            temp.x[i]=aux%10;
            tr=aux/10;
        }
	if(tr)
	{
		temp.x[0]++;
		temp.x[temp.x[0]];
	}
    return temp;
}
HugeN&HugeN::operator-(const HugeN&other)
    {
        HugeN temp;
        int impr,aux,i;
        impr=0;
        temp.x[0]=max(x[0],other.x[0]);
        for(i=1;i<=temp.x[0];i++)
            {
                aux=x[i]-other.x[i]-impr;
                if(aux<0)
                    {
                        temp.x[i]=aux+10;
                        impr=1;
                    }
                else
                    {
                        temp.x[i]=aux;
                        impr=0;
                    }
            }
        while(temp.x[0]>1&&temp.x[x[0]]==0)
            --temp.x[0];
        return temp;
    }
int&HugeN::operator%(int k)
	{
		int i,r=0;
		for(i=x[0];i>=1;i--)
            {
                r=r*10+x[i];
                r=r%k;
            }
        return r;
	}
void HugeN::get_huge()
{
    for(int i=x[0];i>=1;i--)
        printf("%d",x[i]);
    printf("\n");
}
int main()
{
    freopen("next.in","r",stdin);
    freopen("next.out","w",stdout);
    int a,d;
    scanf("%d",&a);
    scanf("%d",&d);
    HugeN n(a);
    HugeN m;
    m=n%d;
    HugeN d1(d);
    d1=d1-m;
    m=n+d1;
    m.get_huge();
    return 0;
}