Cod sursa(job #196087)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 24 iunie 2008 14:54:45
Problema Sarpe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <stdio.h>
#include <math.h>
#include <string.h>

long i, len, v1[1024], v2[1024], cv1, cv2, t, o, n[1024], max, u[1024], sum[1024];
char st[1024];

void inmultire_cu_4() {
	long i = 0;
	long aux = v1[1] * 4;
	v1[1] = v1[1] * 4;
	for (i = 1; i <= cv1 || t != 0; ++i) {
		aux = v1[i] + t;
		v1[i] = aux % 10;
		t = aux / 10;
	}
	cv1 = i - 1;
}

void inmultire_cu_n_1_si_n_2() {
	long i = 0, j = 0;
	for (i = 1; i <= cv1; ++i) {
		for (j = 1; j <= o; ++j) {
			u[i + j - 1] += v2[i] * n[j];
		}
	}
	for( i = 1; i <= cv1 + o - 1 || (u[i] > 0); ++i) {
		u[i + 1] += u[i] / 10;
		u[i] %= 10;
		v2[i] = u[i];
		u[i] = 0;
	}
	max = i - 1;
}

void scadere() {
	long p = 0;
	n[o] -= 1;
	if (n[o] < 0) {
		p = o - 1;
		while (n[p] == 0) {
			--p;
		}
		if (p == 1) {
			n[1] = 9;
		} else {
			--n[p];
		}
		if (p == 1) {
			--o;
		}
		for (long i = p + 1; i <= o; ++i) {
			n[i] = 9;
		}
	}
}

void adunare() {
	long i = 0, aux = 0;
	for (i = 1; i <= cv1 || i <= cv2 || t != 0; ++i) {
		aux = v1[i] + v2[i] + t;
		sum[i] = aux % 10;
		t = aux / 10;
	}
	cv1 = i - 1;
}

int main() {
	freopen("sarpe.in", "r", stdin);
	freopen("sarpe.out", "w", stdout);
	scanf("%s", st);
	len = strlen(st);
	for (i = 0; i < len; ++i) {
		n[++o] = (long)(st[i] - '0');
	}
	for (i = 1; i <= o; ++i) {
		v1[i] = n[i];
	}
	cv1 = o;
	inmultire_cu_4();
	v2[1] = 2;
	cv2 = 1;
	scadere();
	inmultire_cu_n_1_si_n_2();
	scadere();
	inmultire_cu_n_1_si_n_2();	
	adunare();
/*	for (i = cv1; i >= 1; --i) {
		printf("%ld ", v1[i]);
	}
	printf("\n");
	for (i = max; i >= 1; --i) {
		printf("%ld ", v2[i]);
	}*/
	for (i = cv1; i >= 1; --i) {
		printf("%ld", sum[i]);
	}
	printf("\n");
	return 0;
}