Cod sursa(job #1879663)

Utilizator GhSamuelGherasim Teodor-Samuel GhSamuel Data 15 februarie 2017 08:41:18
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;
char n1[1000001], d1[16];
int n[1000001], d[16], cpy[1000001];

FILE * g = fopen("next.out", "w");
ifstream f("next.in");

void adunare(int &nrn1, int &nrd)
{
    int ct = 0, suma, i, j;

    i = nrn1;
    j = nrd;

    while(i >= 0 && j >= 0) {
            suma = n[i] + d[j] + ct;
            ct = suma / 10;
            n[i] = suma % 10;
        --i;
        --j;
    }

    if (i >= 0)
    {
        suma = n[i] + ct;
        ct = suma / 10;
        n[i] = suma % 10;
    }


    if(ct) {
        for (int i = nrn1; i >= 0; --i)
            n[i + 1] = n[i];
        n[0] = 1;
        ++nrn1;
    }

}

int verif(int nrn, int nrd)
{
    int stop = 0;
    if (nrn < nrd)
        return 0;

    if (nrn == nrd)
    for (int i = 0; i <= nrn && !stop; ++i)
        if (cpy[i] < d[i])
        stop = 1;

    if (stop == 1)
        return 0;

    return 1;
}

void scadere_d(int &nrn, int &nrd)
{
    int in, jn;
    in = nrn;
    jn = nrd;

    while (in >= 0 && jn >= 0) {
        if (d[jn] >= cpy[in])
            d[jn] -= cpy[in];
        else {
            --d[jn - 1];
            d[jn] += 10 - cpy[in]; }
        --in;
        --jn;
    }
    if (d[0] == 0) {
        for (int i = 1; i <= nrd; ++i)
            d[i - 1] = d[i];
        --nrd;
    }
}

void scadere(int &nrn, int &nrd)
{
    int in, jn;
    in = nrn;
    jn = nrd;
    while (in >= 0 && jn >= 0) {
        if (cpy[in] >= d[jn])
            cpy[in] -= d[jn];
        else {
            --cpy[in - 1];
            cpy[in] += 10 - d[jn]; }
        --in;
        --jn;
    }
    if (cpy[0] == 0) {
        for (int i = 1; i <= nrn; ++i)
            cpy[i - 1] = cpy[i];
        --nrn;
    }
}

int divi(int &nrn, int nrd)
{
    int stop = 0;
    for (int i = 0; i <= nrn; ++i)
        cpy[i] = n[i];

    while (verif(nrn, nrd)) {
           scadere(nrn, nrd);
    }

    for (int i = 0; i <= nrn && !stop; ++i)
        if (cpy[i])
        stop = 1;

    if (stop)
        return 0;
    return 1;
}

void cautare(int nrn, int nrd)
{
    int nrn1 = nrn;
    divi(nrn, nrd);
    scadere_d(nrn, nrd);
    adunare(nrn1, nrd);

    for (int i = 0; i <= nrn1; ++i)
    fprintf(g, "%d", n[i]);
}

void citire(int &nrn, int &nrd)
{
    f.getline(n1, sizeof(n1), '\n');
        nrn = strlen(n1) - 1;
    f.getline(d1, sizeof(d1), '\n');
        nrd = strlen(d1) - 1;

    for(int i = 0; i <= nrn; ++i)
        n[i] = n1[i] - 48;
    for(int i = 0; i <= nrd; ++i)
        d[i] = d1[i] - 48;
}

int main()
{
    int nrd = 0, nrn = 0;
    citire(nrn, nrd);
    cautare(nrn, nrd);
    return 0;
}