Cod sursa(job #1878827)

Utilizator GhSamuelGherasim Teodor-Samuel GhSamuel Data 14 februarie 2017 14:59:24
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 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 &nrn)
{
    int ct = 0, suma;
    int nrn2 = nrn;

    n[nrn2] += 1;
    while(nrn2 >= 0) {
        suma = n[nrn2] + ct;
        ct = suma / 10;
        n[nrn2] = suma % 10;
        --nrn2;
    }

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

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(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 div(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 divide = 0;
    while (!div(nrn, nrd)) {
        adunare(nrn);
    }

    for (int i = 0; i <= nrn; ++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;
}