Cod sursa(job #92030)

Utilizator 100puncteIonut Popa 100puncte Data 14 octombrie 2007 02:40:31
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
/*
100p
*/
#include<stdio.h>
#include<iostream.h>
#include<string.h>

int n[10003], s[10003], b[10003], i[10003], c[10003];

void citire()
{
  char s[10003];
  freopen("sarpe.in","r",stdin);
  scanf("%s",&s);
  int i, l;
  l=strlen(s);
  for (i=0; i<l; i++)
    n[l-i]=s[i]-'0';
  n[0]=strlen(s);
}

void inmultire(int A[], int B)
{
      int i, t = 0;
      for (i = 1; i <= A[0] || t; i++, t /= 10)
	      A[i] = (t += A[i] * B) % 10;
      A[0] = i - 1;
}

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

int compar(int i[], int n[])
        {
        int j;
        if(i[0]>n[0]) return 1;
        else     //daca sunt egale:
                {
		for(j=n[0];j>=1;j--)
		       if(i[j]>n[j]) return 0;
		return 1;
                }
       return 0;
       }
void scadere(int A[], int B[])
{
       int i, t = 0;
       for (i = 1; i <= A[0]; i++)
	       A[i] += (t = (A[i] -= B[i] + t) < 0) * 10;
       for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
    void mul(int A[], int B[])  
    {  
          int i, j, t, C[10003];  
          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 (i + j - 2 > C[0]) C[0] = i + j - 2;  
        }  
         memcpy(A, C, sizeof(C));  
   }  

void afis()
{
  freopen("sarpe.out","w",stdout);
  for (int i=s[0]; i>=1; i--)
    printf("%d",s[i]);
}

int main()
{
  citire();
  b[0]=1;
  b[1]=2;
  if (n[0]==1 && n[1]==1) { freopen("sarpe.out","w",stdout); printf("2");}
    else  if (n[0]==1 && n[1]==2) { freopen("sarpe.out","w",stdout); printf("8");}
	   else{
  add(s,n);
  inmultire(s,4);
  scadere(n,b);
  memcpy(c,n,sizeof(n));
  b[1]=1;
  add(n,b);
  mul(c,n);
  b[1]=2;
  inmultire(c,2);
  add(s,c);
    
  afis();       }
  return 0;
}