Cod sursa(job #1618397)

Utilizator razvandRazvan Dumitru razvand Data 27 februarie 2016 19:57:16
Problema Next Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <stdio.h>

using namespace std;

int dim;
char cif[1000004];
char t[20];

void mult(long long a) {
    int i,t = 0;
    for(i = 0; i < dim || t; i++) {
        t += cif[i]*a; // nr
        cif[i] = t%10;
        if(cif[i] >= 10)
            cif[i] -= 10;
        t /= 10;
    }
    dim = i;
}

void div(long long a) {
    int i,t = 0;
    for(i = dim-1; i >= 0; i--) {
        t = t*10 + cif[i];
        cif[i] = t/a; // nr
        t %= a; // nr
    }
    for(; dim > 1 && cif[dim-1] == 0; dim--);
}

int mod(long long a) {
    int i,t = 0;
    for(i = dim-1; i >= 0; i--)
        t = (t*10 + cif[i])%a;
    return t;
}

void add1() {
    int i = 0;
    cif[i]++;
    while(cif[i] >= 10) {
        cif[i] -= 10;
        cif[i+1]++;
        i++;
    }
    dim = max(i, dim);
}

int main() {

    FILE *fin = fopen("next.in", "r");
    FILE *fout = fopen("next.out", "w");

    long long d = 0;

    char c;
    fgets(cif, 1000004, fin);
    while(isdigit(cif[dim]))
        cif[dim] = cif[dim++] - '0';
    for(int i = 0; i < dim/2; i++)
        swap(cif[i], cif[dim-i-1]);

    int k = 0;
    fgets(t, 20, fin);
    while(isdigit(t[k]))
        d = d*10 + t[k++] - '0';

    /*add1();
    for(int i = dim-1; i >= 0; i--)
            printf("%d", (int)cif[i]);*/

    if(mod(d) == 0) {
        for(int i = dim-1; i >= 0; i--)
            fprintf(fout, "%d", (int)cif[i]);
    } else {
        div(d);
        add1();
        mult(d);
        for(int i = dim-1; i >= 0; i--)
            fprintf(fout, "%d", (int)cif[i]);
    }

    return 0;
}