Cod sursa(job #2622768)

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

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

typedef int NrMare[10001];
NrMare N;

char s[10001];

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


	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;
    long long rest,div;
    NrMare y;
    fin.getline(s,10001);
    fin>>div;
    //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;
    y[0]=0;  ///pastram in y diferenta dintre divizor si rest
    while(diferenta!=0)
    {
        y[++y[0]]=diferenta%10;
        diferenta=diferenta/10;
    }
    Adunare(N,y);
    ///se afiseaza urmatorul nr divizibil cu div(D)
    for(i=1; i<=N[0]; ++i)
        fout<<N[i];
    return 0;
}