Cod sursa(job #67491)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 25 iunie 2007 10:27:22
Problema Sarpe Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasa a 9-a si gimnaziu Marime 1.11 kb
#include <stdio.h>
#include <string.h>

const int N_MAX = 1024;

int N[N_MAX], N2[N_MAX];

void sub2(int v[])
{
	int i, j;

	if (v[1] >= 2) {
		v[1] -= 2;
	} else {
		v[1] = 10 + v[1] - 2;
		for (i = 2; i <= v[0] && v[i] == 0; i ++);
		v[i] --;
		for (j = 2; j < i; j ++) {
			v[j] = 9;
		}
	}
}

void mul(int v[], int x)
{
	int i, t = 0;
	for (i = 1; i <= v[0] || t; i ++, t /= 10) {
		v[i] = (t += v[i] * x) % 10;
	}

	v[0] = i - 1;
}

void add(int A[], int B[])
{
	int i, t = 0;
	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;
}

void afis(int v[])
{
	int i;
	for (i = v[0]; i >= 1; i --) {
		printf("%d", v[i]);
	}
	printf("\n");
}

int main()
{
	freopen("sarpe.in", "r", stdin);
#ifndef _SCREEN_
	freopen("sarpe.out", "w", stdout);
#endif

	char x;
	while (scanf("%c", &x) != EOF) {
		if ('0' <= x && x <= '9') {
			N[++ N[0]] = x - '0';
		}
	}
	
	int i, aux;
	for (i = 1; i <= N[0] / 2; i ++) {
		aux = N[i];
		N[i] = N[N[0] - i + 1];
		N[N[0] - i + 1] = aux;
	}

	memcpy(N2, N, sizeof(N));
	mul(N, 4);

	sub2(N2);
	mul(N2, 4);

	add(N, N2);
	afis(N);

	return 0;
}