2009-02-14 13:19:48來源不明

95北市資訊學科能力競賽 函數計算 (Comp)

這一題,如果單純用函式去跑,可能會stack overflow,
所以採用 陣列去存,直接讀入。

/********************************************************/

  1. #include<stdio.h>      
  2. #include<stdlib.h>      
  3. int hh[900001]={0},gg[900001]={0};      
  4. int h(int);      
  5. int g(int);      
  6. int f(int);      
  7. main()      
  8. {         
  9.  int n,k,a,b;      
  10.  hh[1]=-1;hh[2]=2;      
  11.  for(a=3,b=0;a<=90000;a++,b++)      
  12.   {      
  13.   hh[a]=2+hh[a-1]-hh[a-2];      
  14.   }      
  15.  for(a=-90000,b=0;a<=2;a++,b++)      
  16.    gg[b]=a*a-1;      
  17.     while(scanf("%d",&n)==1)      
  18.     {       
  19.       printf("%d\n",f(n));      
  20.            
  21.     }      
  22.   return 0;      
  23. }      
  24. int f(int x)      
  25. {   if(x>h(x))       
  26.        return f(x-1)-h(x);      
  27.     else if(x<h(x))       
  28.        return f(g(x))-g(x);      
  29.     else                  
  30.        return 1;      
  31. }   
  32. int h(int y)      
  33. {         
  34.  if(y<2)               
  35.     return (-1);      
  36.  else                  
  37.     return hh[y];      
  38. }      
  39. int g(int z)      
  40. {         
  41.  if(z<=2) return gg[z+90000];      
  42.  else return 2;