Cod sursa(job #2622782)

Utilizator BotezatuGabrielBotezatu Gabriel Eugen BotezatuGabriel Data 1 iunie 2020 20:03:20
Problema Next Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

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

typedef int NrMare[100001];
NrMare N;

char s[100001];

void AtribCuNrMare(NrMare Dest, NrMare Sursa)
{
    int i;
    for(i=0; i<=Sursa[0]; i++)
        Dest[i]=Sursa[i];
}


unsigned long long Divide(NrMare x, int n)
//x = x /n, returneaza x%n
{
    int i,r=0;
    for(i=x[0]; i>0; i--)
    {
        r=10*r+x[i];
        x[i]=r/n;
        r%=n;
    }
    while(x[x[0]]==0 && x[0]>1)
        x[0]--;
    return r;
}
void Adunare(NrMare X, NrMare Y)
/* X <- X+Y */
{
    int i,T=0;

    if (Y[0]>X[0])
    {
        for (i=X[0]+1; i<=Y[0];)
            X[i++]=0;
        X[0]=Y[0];
    }
    else
        for (i=Y[0]+1; i<=X[0];)
            Y[i++]=0;
    for (i=1; i<=X[0]; i++)
    {
        X[i]+=Y[i]+T;
        T=X[i]/10;
        X[i]%=10;
    }
    if (T!=0)
        X[++X[0]]=T;
}



int main()
{
    int lgsir,i,mij;
    unsigned long long rest,div;
    NrMare y;
    fin.getline(s,10001);
    fin>>div;
    fin.close();
    //cout<<div;
    lgsir=strlen(s);

    ///se transforma sirul de caractere in numarul mare N
    N[0]=lgsir;
    for(i=1; i<=lgsir; ++i)
        N[i]=int(s[i-1]-'0');
    mij=N[0]/2;
    for(i=1; i<=mij; ++i )
        swap(N[i],N[N[0]+1-i]);
    AtribCuNrMare(y,N); ///copiez numarul mare N in numarul mare y
    rest=Divide(y,div); ///restul(R) impartirii la divizor (D)
    long long diferenta=(div-rest)%div;
    y[0]=0;  ///pastram in y diferenta dintre divizor si rest
    if(diferenta!=0)
    {
        while(diferenta!=0)
        {
            y[++y[0]]=diferenta%10;
            diferenta=diferenta/10;
        }
        Adunare(N,y);
    }
    ///se afiseaza urmatorul nr divizibil cu div(D)
    for(i=N[0]; i>=1; --i)
        fout<<N[i];
    fout<<"\n";
    fout.close();
    return 0;
}