Cod sursa(job #1006074)

Utilizator poptibiPop Tiberiu poptibi Data 6 octombrie 2013 12:24:17
Problema Next Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;

const int NMAX = 1000050;

int V[NMAX], D;
char S[NMAX];

void Div()
{
    int i, T = 0;
    for(i = V[0]; i >= 1; -- i, T %= D)
        V[i] = (T = T * 10 + V[i]) / D;
    for(; V[0] > 1 && !V[V[0]]; V[0] --);
}

int Mod()
{
    int i, T = 0;
    for(i = V[0]; i >= 1; -- i)
        T = (T * 10 + V[i]) % D;
    return T;
}

void Increment()
{
    for(int i = 1; i <= V[0]; ++ i)
    {
        V[i] ++;
        if(V[i] == 10) V[i] = 0, V[i + 1] ++;
    }
    if(V[V[0]] == 10) V[V[0]] = 0, V[0] ++, V[V[0]] = 1;
}

void Mult()
{
    int i, T = 0;
    for(i = 1; i <= V[0] || T; ++ i, T /= 10)
        V[i] = (T += V[i] * D) % 10;
    V[0] = i - 1;
}

int main()
{
    ifstream cin("next.in");
    ofstream cout("next.out");

    cin >> (S + 1);
    cin >> D;
    int N = strlen(S + 1);
    for(int i = N; i; -- i)
        V[++V[0]] = S[i] - '0';

    if(Mod() == 0)
    {
        for(int i = V[0]; i; -- i)
            cout << V[i];
        return 0;
    }
    Div();
    Increment();
    Mult();

    for(int i = V[0]; i; -- i)
        cout << V[i];

    return 0;
}