Cod sursa(job #2113303)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 24 ianuarie 2018 14:34:13
Problema Next Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("next.in");
ofstream g("next.out");

short N[1000010], a[1000010], Di[1000010], one[1000010] = {0, 1};
long long D, Daux;
char str[1000010];
void difference(short a[], short b)
{
    int t = 0, i = a[0];
    for(i = 1; i <= a[0] || t > 0; i++) {
        a[i] -= b % 10 + t;
        if(a[i] < 0) t = 1;
        else t = 0;
        a[i] += t * 10;
        b /= 10;
    }
    while(a[i] <= 0 && a[a[0]] == 0) a[0]--;
}
void add(short a[], short b[])
{
    int transport = 0, i = 1;
    for (i = 1; i <= a[0] || i <= b[0]; i++) {
        transport += a[i] + b[i];
        a[i] = transport % 10;
        transport /= 10;
    }
    a[0] = i - 1;
}

long long divide(short ax[], long long nr)
{
    long long rest = 0;
    for(int i = 0; i <= ax[0]; i++)
        a[i] = ax[i];
    for (int i = a[0]; i >= 1; i--) {
        rest = 10 * rest + a[i];
        a[i] = rest / nr;
        rest %= nr;
    }
    while (a[0] > 0 && !a[a[0]]) a[0]--;
    return rest;
}
int main()
{
    f >> str >> D;
    long long Daux = D;
    N[0] = strlen(str);
    for(int i = 1; i <= N[0]; i++)
        N[i] = str[N[0] - i] - '0';
    while(D) {
        Di[++Di[0]] = D % 10;
        D /= 10;
    }
    int rest = divide(N, Daux);
    difference(Di, rest);
    add(Di, N);
    for(int i = Di[0]; i >= 1; i--)
        g << Di[i];
    g << "\n";
    return 0;
}