Cod sursa(job #68968)

Utilizator peanutzAndrei Homorodean peanutz Data 30 iunie 2007 14:54:55
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <ctype.h>
#define NMAX 10000//0
#include <string.h>

int n[NMAX+5];
int aux[NMAX+5];

void read()
{
    char aux[NMAX+5];
    int i;

    scanf("%s", aux+1);
    //printf("%s", aux+1);

    n[0] = strlen(aux+1);


    for(i = 1; i <= n[0]; ++i)
	n[i] = aux[n[0]-i+1]-'0';

}

void mulmic(int n[NMAX+5], int b)
{
	int i, t;
	for(t = 0, i = 1; i <= n[0] || t; ++i, t /= 10)
		n[i] = (t += n[i] * b) % 10;
	n[0] = i-1;
}

void scade(int a[NMAX+5], int b)
{
     int i, t;

     a[1] -= b;
     if(a[1] < 0)
     {
	     a[1] += 10;
	     for(i = 2; ; ++i)
		   if(!a[i])
			   a[i] = 9;
		   else
		   {
		       --a[i];
		       return ;
		   }
     }
}

void mulmare(int a[NMAX+5], int b[NMAX+5])
{
     int c[NMAX+5];
     int i, j, t;
     memset(c, 0, sizeof(c));

     for(i = 1; i <= a[0]; ++i)
     {
	   for(t = 0, j = 1; j <= b[0]  || t; ++j, t /= 10)
		 c[i+j-1] = (t += c[i+j-1] + a[i]*b[j]) % 10;
	   if(c[0] < i+j-2)
		   c[0] = i+j-2;
      }
      memcpy(a, c, sizeof(c));
}

void print(int a[NMAX+5])
{
     int i;
     //for(i = 1; i <= a[0]; ++i)
     for(i = a[0]; i; --i)
	   printf("%d", a[i]);
     printf("\n");
}

void aduna(int a[NMAX+5], int b[NMAX+5])
{
	int i, t;
	for(t = 0, i = 1; i <= a[0] || i <= b[0] || t; ++i, t /= 10)
		a[i] = (t += a[i] + b[i]) % 10;
	a[0] = i-1;

	for(;a[0] > 0 && !a[a[0]]; --a[0]);
}


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

	read();

    if(n[0] == n[1] && n[1] == 1)
    {
            printf("%d\n", 2);
            return 0;
    }

	int n1[NMAX+5], n2[NMAX+5];


    memcpy(n1, n, sizeof(n));
    memcpy(n2, n, sizeof(n));

    scade(n1, 2);
    scade(n2, 1);

    mulmic(n, 4);
    mulmic(n2, 2);
    mulmare(n1, n2);

    aduna(n, n1);
    

    print(n);

	return 0;
}