Cod sursa(job #67597)

Utilizator FlorianFlorian Marcu Florian Data 25 iunie 2007 12:23:53
Problema Sarpe Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasa a 9-a si gimnaziu Marime 1.5 kb
#include<stdio.h>
#include<string.h>

int n[1003], s[1003], b[1003], i[1003], c[1003];
FILE*f=fopen("sarpe.in","r");
FILE*g=fopen("sarpe.out","w");
void citire()
{
  char s[1003];
  fscanf(f,"%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 afis()
{
  for (int i=s[0]; i>=1; i--)
   fprintf(g,"%d",s[i]);
}

int main()
{
  citire();
  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{
  b[0]=b[1]=1;
  i[1]=i[0]=1;
  scadere(n,b);
  while (compar(i,n)==1)
    {

      memcpy(c,i, sizeof(i));
      inmultire(c,4);
      add(s,c);
      add(i,b);
    }
  afis();       }
  return 0;
}