Cod sursa(job #480504)

Utilizator miculprogramatorA Cosmina - vechi miculprogramator Data 28 august 2010 11:15:03
Problema Next Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <stdio.h>
#include <string.h>
using namespace std;

#define MAX 100000000

char sir[MAX];
int n[MAX];
long long d, rest;
int lg, i, j, k;

void adunare_nr_mic (int nr[], int x)
{
    int suma_cf = 0, suma_tr = 0, cf = 0;
    i = 1;

    while (x && i <= nr[0])
    {
        suma_cf = nr[i] + (x % 10) + suma_tr;
        nr[i] = suma_cf % 10;
        suma_tr = suma_cf / 10;

        x /= 10;
        i ++;
        cf ++;
    }
    while (suma_tr)
    {
        nr[i] += suma_tr;
        suma_cf = nr[i];
        nr[i] %= 10;
        suma_tr = suma_cf / 10;
        i ++;
        cf ++;
    }

    if (cf > nr[0])
        nr[0] = cf;
}


void afisare (int nr[])
{
    FILE *g = fopen ("next.out","w");

    for (i=nr[0]; i>=1; --i)
        fprintf (g, "%d", nr[i]);
    fprintf (g, "\n");
}

int mod_nr_mic (int nr[], int x)
{
    int t = 0;
    for (i=nr[0]; i>=1; --i)
        t = (t * 10 + nr[i]) % x;

    return t;
}

int scadere_nr_mic (int nr[], int x)
{
    i = 1;
    while (x && i <= nr[0])
    {
        if (nr[i] < x % 10)
        {
            k = i + 1;
            while (!nr[k])
            {
                nr[k] = 9;
                k ++;
            }
            nr[k] --;
            nr[i] = nr[i] + 10 - (x % 10);
        }
        else
            nr[i] -= (x % 10);

        x /= 10;
        i ++;
    }
}

int main ()
{
    FILE *f = fopen ("next.in","r");


    fscanf (f,"%s", sir);
    lg = strlen (sir);
    for (i=lg-1; i>=0; --i)
    {
        n[0] ++;
        n[n[0]] = sir[i] - '0';
    }

    fscanf (f,"%lld", &d);

    rest = mod_nr_mic (n, d);
    j = (d - rest ) % d;
    adunare_nr_mic (n, j);


    afisare (n);

    fclose (f);
    return 0;
}