Cod sursa(job #2009937)

Utilizator MaligMamaliga cu smantana Malig Data 11 august 2017 12:30:25
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 4.94 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;
ifstream in("bigNumber.in");
ofstream out("bigNumber.out");

#define ll long long
#define ull unsigned long long
#define pb push_back
const int NMax = 1e3 + 5;

int T;
char str[NMax];
// str - sir auxiliar pentru citire;

void readNr(short*);
ll getNr(short*);
void print(short*);
short cmp(short*,short*);
void add(short*,short*);
void sub(short*,short*);
void prod(short*,ll);
void prod(short*,short*);
ll imp(short*,ll);
ll imp(short*,short*);
ll rem(short*,ll);
// readNr(a) = citeste un big number din input si il pune in vectorul a;
// getNr(a) = returneaza un numar mic dintr-unul mare (a)
//            pentru functiile special implementate pentru numere mici;
// print(a) = afiseaza corect numarul retinut in big number-ul a;
// cmp(a,b) - compara doua numere mari; returneaza -1 daca a<b, 0: a==b, 1: a>b;
// add(a,b) - suma celor doua numere mari este pusa in a;
// sub(a,b) - a>b; diferenta celor doua numere mari este pusa in a;
// prod(a,nr) - produsul dintre numarul mare a si numarul mic nr este pus in a;
// prod(a,b) - produsul dintre cele doua numere mari este pus in a;
// imp(a,nr) - catul impartirii dintre numarul mare a si numarul mic nr este pus in a,
//             restul este returnat;
// imp(a,b) - catul impartirii dintre numarul mare a si numarul mare b este pus in a,
//             restul este ignorat, dar se poate obtine usor;
// rem(a,nr) - restul impartirii dintre numarul mare a si numarul mic nr este returnat,
//             a ramane neschimbat;

int main() {

    in>>T;
    while (T--) {
        char tip;
        in>>tip;
        in.getline(str,NMax);

        short a[NMax] = {},b[NMax] = {};
        readNr(a);
        readNr(b);

        if (tip == '<') {
            out<<cmp(a,b)<<'\n';
        }
        else if (tip == '+') {
            add(a,b);
            print(a);
        }
        else if (tip == '-') {
            if (cmp(a,b) == 1 || cmp(a,b) == 0) {
                sub(a,b);
                print(a);
            }
            else {
                sub(b,a);
                out<<"-";
                print(b);
            }
        }
        else if (tip == 'p') {
            ll nr = getNr(b);
            prod(a,nr);
            print(a);
        }
        else if (tip == '*') {
            prod(a,b);
            print(a);
        }
        else if (tip == 'd') {
            ll nr = getNr(b);
            imp(a,nr);
            print(a);
        }
        else if (tip == '/') {
            imp(a,b);
            print(a);
        }
        else if (tip == 'r') {
            ll nr = getNr(b);
            out<<rem(a,nr)<<'\n';
        }
    }

    in.close();out.close();
    return 0;
}

void readNr(short* a) {
    cin.getline(str,NMax);
    N = strlen(str);

    a[0] = N;
    for (int i=1;i<=N;--i) {
        a[i] = str[N-i] - '0';
    }
}

ll getNr(short* a) {
    ll ans = 0;

    for (int i=a[0];i>0;--i) {
        ans = ans * 10 + a[i];
    }
    return ans;
}

void print(short* a) {
    for (int i=a[0];i>0;--i) {
        out<<a[i];
    }
    out<<'\n';
}

short cmp(short* a,short* b) {
    if (a[0] < b[0]) {
        return -1;
    }
    if (a[0] > b[0]) {
        return 1;
    }

    for (int i=a[0];i>0;--i) {
        if (a[i]<b[i]) {
            return -1;
        }
        if (a[i]>b[i]) {
            return 1;
        }
    }
    return 0;
}

void add(short* a,short* b) {
    for (int i=1,t = 0;i <= a[0] || t;++i,t/=10) {
        a[i] = (t += a[i]+b[i])%10;
    }
    a[0] = i-1;
}

void sub(short* a,short* b) {
    for (int i=1,t = 0;i <= a[0];++i) {
        a[i] -= b[i] + t;
        a[i] += (t = (a[i] < 0)) * 10;
    }
    while (a[a[0]] == 0 && a[0]>1) {
        --a[0];
    }
}

void prod(short* a,ll nr) {
    for (int i=1,t = 0;i <= a[0] || t;++i,t/=10) {
        a[i] = (t += a[i]*nr)%10;
    }
    a[0] = i-1;

    if (nr == 0) {
        a[0] = 1;
        a[1] = 0;
    }
}

void prod(short* a,short* b) {

    short c[NMax] = {};
    for (int i=1;i <= a[0];++i) {
        for (int j=1,t=0;j <= b[0] || t;++j,t /= 10) {
            c[i+j-1] = (t += a[i]*b[j] + c[i+j-1])%10;
        }
    }

    if ((a[0] == 1 && a[1] == 0) || (b[0] == 1 && b[1] == 0)) {
        a[0] = 1;
        a[1] = 0;
        return;
    }

    if (c[a[0]+b[0]] != 0) {
        c[0] = a[0]+b[0];
    }
    else {
        c[0] = a[0]+b[0]-1;
    }

    for (int i=0;i <= c[0];++i) {
        a[i] = c[i];
    }
}

ll imp(short* a,ll b) {
    int t=0;
    for (int i=a[0];i>0;--i) {
        a[i] = (t = t * 10 + a[i])/b;
        t %= b;
    }

    while (a[a[0]] == 0 && a[0]>1) {--a[0];}

    return t;
}

ll rem(short* a,ll b) {
    int t=0;
    for (int i=a[0];i>0;--i) {
        t = (t * 10 + a[i])%b;
        t %= b;
    }

    return t;
}

ll imp(short* a,short* b) {

}