Cod sursa(job #1287616)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 7 decembrie 2014 21:34:42
Problema Next Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;

#define MAX_DIG 1000001
#define BASE 10

typedef long long LL;
char s[MAX_DIG];

class Huge {
private:
    int dig;
    char x[MAX_DIG];
public:
    Huge();
    Huge(const char s[]);
    Huge(LL n);
    void PRT();
    LL operator %(const LL k);
    void operator +=(const Huge &other);
};

Huge::Huge() {
    memset(x, 0, sizeof(x));
    dig = 1;
}

Huge::Huge(const char s[]) {
    dig = strlen(s);
    for(int i = 0; i < dig; i++)
        x[dig - i] = s[i] - '0';
}

Huge::Huge(LL n) {
    memset(x, 0, sizeof(x));
    dig = 0;
    do {
        x[++dig] = n % BASE;
        n /= BASE;
    } while(n);
}

void Huge::PRT() {
    int i;
    for(i = dig; i; i--)
        printf("%d", x[i]);
    printf("\n");
}

LL Huge::operator %(const LL k) {
    int i, r;
    for(i = dig, r = 0; i; i--) {
        r = r * BASE + x[i];
        r %= k;
    }
    return r;
}

void Huge::operator +=(const Huge &other) {
    int i, t;
    dig = max(dig, other.dig);
    for(i = 1, t = 0; i <= dig; i++) {
        x[i] += other.x[i] + t;
        t = 0;
        if(x[i] >= BASE)
            x[i] -= BASE, t = 1;
    }
    if(t)
        x[++dig] = t;
}

int main() {
    freopen("next.in", "r", stdin);
    freopen("next.out", "w", stdout);
    
    int lg;
    LL k, r;
    
    gets(s);
    lg = strlen(s);
    if(s[lg-1] == 10)
        s[lg-1] = 0;
    Huge N(s);
    
    scanf("%lld", &k);
    r = N%k;
    r = k - r;
    Huge Add(r);
    N += Add;
    N.PRT();
    return 0;
}