题意:将一个给定的数X以斐波那契数列为权写成0,1字串的形式,然后右移以为,再转换为10进制形式。
例如,42写成斐波纳契数列为(1,0,- 0、1,0,- 0,0,- 0),我们将其右移一位获得(1,0,- 0、1,0,- 0,0)。
计算0*1 + 0*2 + 0*3 + 1*5 + 0*8 + 0*13 + 1*21 = 26。
很简单的题目,直接先把斐波那契数列用数组存起来,然后循环对X自减即可。
我的代码(time : 15MS, MEM:212KB, CODE:463B),效率有点低,
第一名(time : 0MS, MEM:180KB, CODE:498B),不知道怎么写的==
以后再改进吧现在只能达到这程度了
View Code
#include <stdio.h>
#define N 21
short f[N] = {1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610,
987, 1597, 2584, 4181, 6765, 10946, 17711};
int main()
{
short t = 0;
short x = 0;
short j = 0;
short ans = 0;
scanf ("%d", &t);
while ( t-- )
{
scanf ("%d", &x);
ans = 0;
for ( j = N - 1; x > 1; --j)
{
if (f[j] <= x)
{
x -= f[j];
ans += f[j - 1];
}
}
printf ("%d\n", ans);
}
return 0;
}