Cod sursa(job #72981)

Utilizator zobicaMarin Marin zobica Data 16 iulie 2007 00:48:57
Problema Sarpe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>

using namespace std;

ofstream fout("sarpe.out");	

int a[2];
int n[2005];
int n1[2005];
int n2[2005];
int r[2005];
int r1[2005];
int r2[2005];
int r3[2005];


void citire(){
	ifstream fin("sarpe.in");
	n[0] = 0;
	char x;
	fin.get(x);
	while (!fin.eof()){			
		n[++n[0]] = x - '0';
		fin.get(x);
	}
	fin.close();
}

void invers(int a[]) {
	for (int i = 1; i <= (a[0] >> 1); i ++) {
		int aux = a[i];
		a[i] = a[a[0] - i + 1];
		a[a[0] - i + 1] = aux;
	}
}

void inmultire(int a[2005], int b[2005], int c[2005]){
	int p = 0;
	int n = a[0]; 
	for(int i = 1; i<= b[0]; i++) {		
		for(int j = 1; j <= a[0]; j++)			
			c[j + p] += a[j] * b[i];		
		p++;		
	}
	n += p - 1;	
	for(int j = 1; j <= n; j++){
		c[j + 1] += c[j] / 10;
		c[j] %= 10;
	}
	if(c[n + 1] > 0) 
		n++;
	c[0] = n;
}


void adun(int a[], int b[], int c[]) {
	int t =0;
	int n = (a[0] > b[0]) ? a[0] : b[0];
	for (int i = 1; i <= n; i ++) {
		int cif = a[i] + b[i] + t;
		c[i] = cif % 10;
		t  = cif / 10;
	}
	if (t > 0) 
		c[n ++] = t;
	c[0] = n;
}

void scad_1(int a[]){
	a[1] --;
	int i = 1;
	while (i <= a[0] && a[i] < 0) {
		a[i + 1]--;
		a[i++] += 10;
	};
	i = a[0];
	while (i > 1 && !a[i] )i--;
	a[0]= i;

}

void afisare(int a[]){
	
	for(int i = a[0] ; i > 0 ; i--)
		fout << a[i];
	fout << endl;
	
}


int main() {
	citire();
	invers(n);
	a[0] = 1;
	a[1] = 4;
	inmultire(a, n, r1);	
	//afisare(r1);
	memcpy(n1, n, sizeof(n));
	scad_1(n1);
	//afisare(n1);
	memcpy(n2, n1, sizeof(n1));
	scad_1(n2);
	//afisare(n2);
	inmultire(n1, n2, r2);
	//afisare(r2);
	a[0] = 1;
	a[1] = 2;
	inmultire(a,r2, r3);
	//afisare(r3);
	adun(r1, r3, r);
	afisare(r);
	fout.close();    
	return 0;
}