Cod sursa(job #733027)

Utilizator danalex97Dan H Alexandru danalex97 Data 11 aprilie 2012 12:55:42
Problema Next Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <fstream>
using namespace std;

ifstream F("next.in");
ofstream G("next.out");

#define Lint long long
#define Dmax 1000100

#define nat(chr) ( int(chr)-int('0') )
#define OK(chr) ( nat(chr)>-1 && nat(chr)<10 )
#define swp(a,b) ( a ^=b ^=a ^=b )

typedef int Huge[Dmax];
typedef char String[Dmax];

Huge N; 
Lint D,Dim; 
String C;

Lint Modulo(Huge A,Lint N,Lint D)
{
	Lint Nbr=0;
	for (int i=1;i<=N;++i)
	{
		Nbr= Nbr * 10 + A[i] ; 
		while ( Nbr>=D ) Nbr-=D;
	}		
	return Nbr;
}

void Read()
{
	F.getline(C,Dmax,'\n');
	F>>D;
	
	for (int i=0; OK(C[i]) ;++i)
		N[++Dim]=nat(C[i]);
}

void Turn()
{
	for (int i=1;i<=Dim/2;++i)
		swp(N[i],N[Dim-i+1]);
}

void Add(Huge A, Lint& N, Lint D)
{
	A[1]+=D;
	for (int i=1;i<N;++i)
		if ( A[i]>9 )
			A[i+1]+=A[i]/10,A[i]%=10;
	while ( A[N]>9 )
		A[N+1]+=A[N]/10,A[N++]%=10;
}

void Write()
{
	for (int i=1;i<=Dim;++i)
		G<<N[i];
	G<<'\n';
}

int main()
{
	Read();
	D=( D-Modulo(N,Dim,D) )%D;
	
	Turn();
	Add(N,Dim,D);
	Turn();
	
	Write();
	
	F.close();
	G.close();
	return 0;
}