hdu 2370

地址:http://acm.hdu.edu.cn/showproblem.php?pid=2370

题意:一个数字可以表示成若干个fibonacci数的和。求表示成fib后“右移”1位的数字。

mark:打表前30个fib数,然后用贪心法可算出任何数字的fib数表示形式,再累加。

代码:

# include <stdio.h>
# include <string.h>


int fib[35] = {1,1} ;
int tab[35] ;


void init()
{
int i ;
for (i = 2 ; i <= 30 ; i++)
fib[i] = fib[i-1]+fib[i-2] ;
}


void set (int x)
{
int i ;
for (i = 25 ; i>= 1 ; i--)
if (fib[i] <= x) tab[i] = 1, x -= fib[i] ;
}


int main ()
{
int n, x, sum, i ;
init() ;
scanf ("%d", &n) ;
while (n--)
{
scanf ("%d", &x) ;
memset (tab, 0, sizeof(tab)) ;
set(x) ;
for (i = 2, sum = 0 ; i <= 30 ; i++)
if (tab[i]) sum += fib[i-1] ;
printf ("%d\n", sum) ;
}

return 0 ;
}



posted @ 2012-02-16 08:15  Seraph2012  阅读(186)  评论(0编辑  收藏  举报