地址: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 ;
}