Cod sursa(job #68927)

Utilizator peanutzAndrei Homorodean peanutz Data 30 iunie 2007 01:34:40
Problema Sarpe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define NMAX 1000//0//00

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

void read()
{
    char c;
    do
    {
      scanf("%c", &c);
      if(c == '\n')
           break;
      n[ ++n[0] ] = c-'0';
    }while(1);
}
		
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] || j <= c[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 = 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;
}


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

	read();

	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;
}