Cod sursa(job #1748252)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 26 august 2016 11:53:38
Problema Next Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

const int NMAXDIGIT = 1000005;
char s[1000005];
class HugeN
{
private:
    int x[NMAXDIGIT];
public:
    HugeN()
    {
        memset(x,0,sizeof(x));
        x[0] = 1;
    }
    HugeN(char *s)
    {
        int n = strlen(s);
        memset(x,0,sizeof(x));
        x[0] = n;
        for(int i = n - 1 ; i >= 0 ; i--)
        {
            x[n - i] = (s[i] - '0');
        }
    }
    void get_huge();
    HugeN&operator +(int k);
    HugeN&operator +(const HugeN &other);
    long long operator %(long long k);
    HugeN& operator+=(long long k);
};

void HugeN::get_huge()
{
    for(int i = x[0] ; i >= 1 ; i--)
    {
        printf("%d",x[i]);
    }
    printf("\n");
}


HugeN& HugeN::operator +(const HugeN &other)
{
    HugeN temp;
    temp.x[0] = max(x[0],other.x[0]);
    int tr = 0 , aux;
    for(int i = 1 ; i <= temp.x[0] ; i++)
    {
        aux = x[i] + other.x[i] + tr;
        temp.x[i] = aux % 10;
        tr = aux / 10;
    }
    if(tr != 0)
    {
        temp.x[0]++;
        temp.x[temp.x[0]] = tr;
    }
    return temp;
}

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

HugeN& HugeN::operator += (long long k)
{
    long long tr = k;
    long long aux;
    for(int 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 /= 10;
    }
    return *this;
}
int main()
{
    freopen("next.in","r",stdin);
    freopen("next.out","w",stdout);
    long long D;
    gets(s);
    scanf("%lld",&D);
    HugeN N(s);
    int r = N % D;
    N += (D - r);
    N.get_huge();
    return 0;
}