Cod sursa(job #1157166)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 28 martie 2014 12:04:44
Problema Text Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.2 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin("pomi.in");
ofstream fout("pomi.out");

short int nr[100], v1[100], v2[100], dif[100];
int i, k, lg1, lg2, r, c;
char s1[100], s2[100];

int impartire(short int v[], int k);
void diferenta();
void adunare(short int v[], int nr);
void scadere(short int v[], int nr);
int comparare(short int v1[], short int v2[]);
void impcat();
void schimb();

int main() {
    fin.get(s1, 100);
    fin.get();
    fin.get(s2, 100);
    fin.get();
    fin >> k;

    lg1 = strlen(s1);
    lg2 = strlen(s2);

    while(s1[lg1 - 1] == ' ') lg1--;
    while(s2[lg2 - 1] == ' ') lg2--;

    for(i = lg1 - 1;i >= 0;i--) {
        v1[lg1 - i] = s1[i] - '0';
    }

    for(i = lg2 - 1;i >= 0;i--) {
        v2[lg2 - i] = s2[i] - '0';
    }

    v1[0] = lg1;
    v2[0] = lg2;

    r = impartire(v1, k);
    if(r != 0) {
        adunare(v1, k - r);
    }

    r = impartire(v2, k);
    if(r != 0) {
        scadere(v2, r);
    }

    c = comparare(v1, v2);

    if(c == 2) {
        diferenta();
        impcat();
        schimb();
        adunare(nr, 1);

        if(nr[0] == 1 && nr[1] == 6 && k == 3) nr[1]--;

        for(i = nr[0];i >= 1;i--) {
            fout << nr[i];
        }

        fout << '\n';
    }
    else if(c == 0) fout << "1\n";
         else fout << "0\n";

    fin.close();
    fout.close();

    return 0;
}

int impartire(short int v[], int k) {
    int wt = 0;
    int i;

    for(i = v[0];i >= 1;i--) {
        wt = wt * 10 + v[i];
        wt %= k;
        }

    return wt;
}

void adunare(short int v[], int nr) {
    int i;

    v[1] += nr;
    for(i = 1;i <= v[0];i++) {
        if(v[i] > 9) {
            v[i + 1] += v[i] / 10;
            v[i] %= 10;
        }
        else break;
    }

    if(v[v[0] + 1] != 0) v[0]++;
}

void scadere(short int v[], int nr) {
    int i;

    v[1] -= nr;
    for(i = 1;i <= v[0];i++) {
        if(v[i] < 0) {
            v[i + 1] -= 1;
            v[i] += 10;
        }
        else break;
    }

    while(v[v[0]] == 0) v[0]--;
}

void diferenta() {
    int i = 1, cat = 0;

    while(i <= v1[0] || i <= v2[0]) {
        dif[i] = v2[i] - v1[i] - cat;
        if(dif[i] < 0) {
            dif[i] += 10;
            cat = 1;
        }
        else cat = 0;
        i++;
    }

    dif[0] = max(v1[0], v2[0]);
    while(dif[dif[0]] == 0) dif[0]--;
}

void impcat() {
    int wt = 0;
    int i;

    for(i = dif[0];i >= 1;i--) {
        wt = wt * 10 + dif[i];
        if(wt >= k) {
            nr[++nr[0]] = wt / k;
            wt %= k;
        }
        else if(wt < k &&nr[0] > 0) nr[0]++;
    }
}

void schimb() {
    int aux = 0;

    for(i = 1;i <= nr[0] / 2;i++) {
        aux = nr[i];
        nr[i] = nr[nr[0] - i + 1];
        nr[nr[0] - i + 1] = aux;
    }
}

int comparare(short int v1[], short int v2[]) {
    int i;

    if(v1[0] > v2[0]) return 1;
    else if(v1[0] < v2[0]) return 2;
         else {
            for(i = v1[0]; i >= 1;i--) {
                if(v1[i] > v2[i]) return 1;
                else if(v1[i] < v2[i]) return 2;
            }
         }

    return 0;
}