Cod sursa(job #729195)

Utilizator danalex97Dan H Alexandru danalex97 Data 29 martie 2012 12:50:18
Problema Sarpe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
using namespace std;

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

#define Lmax 3022
int N[Lmax],Ln,Lr,Lr2,Lr3;
int Rez[Lmax],Rez2[Lmax];
int Rez3[Lmax];
char C[Lmax];

void Mul(int A[],int& La,int B[],int& Lb) 
{
	for (int j=1;j<=La;++j)
	{
		A[j]*=max(B[j],1);
		if (A[j]>9)
		{
			A[j+1]+=A[j]/10;
			A[j]%=10;
		}
	}
	for (;A[La]>9;)
	{
		A[++La]=A[La-1]/10;
		A[La-1]%=10;
	}
}

void Smul(int A[],int &La,int B)
{
	for (int j=1;j<=La;++j)
	{
		A[j]*=B;
		if (A[j]>9)
		{
			A[j+1]+=A[j]/10;
			A[j]%=10;
		}
	}
	for (;A[La]>9;)
	{
		A[++La]=A[La-1]/10;
		A[La-1]%=10;
	}
}

void Del(int A[],int &La,int B)
{
	bool oke=true;int i;
	for (i=1;B>0;++i)
	{
		A[i]-=B%10;
		B/=10;
		oke=( A[i]<0 )? false : oke;
	}
	for (int j=i;j<i;++j)
		A[j]+=10;
	if (!oke)
	{
		--A[i];
		while (A[i]==-1)
			--A[++i];
		while (A[La]==0)
			--La;
	}
}

void read()
{
	F.getline(C,Lmax,'\n');
	Ln=0;
	for (int j=0;( int(C[j])-int('0')>=0 && int(C[j])-int('0')<=9 );++j)
		N[++Ln]=int(C[j])-int('0');
	for (int j=1;j<=Ln/2;++j)
		swap(N[j],N[Ln-j+1]);
	Lr=Lr2=Lr3=Ln;
	for (int i=1;i<=Ln;++i)
		Rez[i]=Rez2[i]=Rez3[i]=N[i];
}

void Adu(int A[], int B[],int &La,int &Lb)
{
	int i, t = 0;
	A[0]=La,B[0]=Lb;
	for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
		A[i] = (t += A[i] + B[i]) % 10;
	A[0] = i - 1;
	La=A[0];
}

void write()
{
	for (int i=Lr;i>0;--i)
		G<<Rez[i];
	G<<'\n';
}

int main()
{
	read();
	Del(Rez2,Lr2,1);
	Del(Rez3,Lr3,2);
	if (Rez3[1]==0) 
		Rez2[1]=0;
	else
		Mul(Rez2,Lr2,Rez3,Lr3);
	Smul(Rez2,Lr2,2);
	Smul(Rez,Lr2,4);
	Adu(Rez,Rez2,Lr,Lr2);
	write();
	F.close();
	G.close();
	return 0;
}