Cod sursa(job #1778106)

Utilizator VictoriaNevTascau Victoria VictoriaNev Data 13 octombrie 2016 14:47:10
Problema Next Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <cstdio>
#include <cstring>
#include <fstream>
using namespace std;
const int MAX_DIGITS=1000000;
const int BASE=10;
ofstream out("next.out");
class HugeN
{
private:
    int x0;
    char x[MAX_DIGITS+5];
public:
    HugeN()
    {
        x0=0;
    }

    HugeN(long long nr)
    {
        x0=0;
        do
        {
            x[++x0]=nr%10;
            nr/=BASE;
        }
        while(nr);
    }

    HugeN(char *s)
    {
        x0=strlen(s);
        for(int i=1; i<=x0; i++)
            x[i]=s[x0-i]-'0';
    }

    void read()
    {
        x0=0;
        char c;
        while (scanf("%c",&c)!=EOF && c!='\n')
        {
            c=c-'0';
            x[++x0]=c;
        }
        for (int i=1; i<=x0/2; i++)
        {
            char aux;
            aux=x[i];
            x[i]=x[x0-i+1];
            x[x0-i+1]=aux;
        }
    }

    void print()
    {
        for (int i=x0; i>=1; i--)
            out<<(int)x[i];

    }

    HugeN operator += (const HugeN &other);
    long long operator % (long long k);
};

HugeN HugeN::operator += (const HugeN &other)
{
    ///x=x+other.x
    x0=x0>other.x0 ? x0 : other.x0;
    int tr=0, aux, i;
    for(int i=1; i<=x0; i++)
    {
        aux=x[i]+other.x[i]+tr;
        x[i]=aux%BASE;
        tr=aux/BASE;
    }
    if(tr)
        x[(int)++x0]=tr;
    return *this;
}

long long HugeN::operator % (long long k)
{
    long long r=0;
    for(int i=x0; i>=1; i--)
        r=(r*10+x[i])%k;
    return r;
}

int main()
{
    freopen("next.in","r",stdin);
    long long k, r;
    HugeN n;
    n.read();
    scanf("%lld", &k);
    r=n%k;
    if(r==0)
        r=k;
    r=k-r;
    HugeN x(r);
    n+=x;
    n.print();
    return 0;
}