您的位置:首页 > 大数据 > 人工智能

【暑假测试2】A HDU 1021 Fibonacci Again(水:递推、找规律)

2015-07-28 22:07 429 查看

题意

另一种形式的斐波拉契数列是这样的:F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2). ,当输入一个 n (n < 1000000 ),输出对应的 F(n) 是否能被 3 整除,按实际输出“yes”或者“no”。

思路

(1)一开始的想法是弄一个数组,递推出每个值。再根据 n 的值索引找到对应的值,然后除以三,看余数是否为零。但这种思路太天真了,数组绝对会炸。遂放弃。
(2)第二种思路源于第一种,既然存的值太大会炸,那就把多余的部分去掉好了,F(0) 存余数1, F(1) 存余数2。。。然后递推出每个值。再根据 n 的值索引找到对应的值,然后除以三,看余数是否为零。这个方法能够 AC,详见方法一。
(3)第三种路源于第二种,直接找规律,F(0) 存余数1, F(1) 存余数2,F(2) 存余数0,F(3) 存余数2,F(4) 存余数2,F(5) 存余数1,F(6) 存余数0,F(7) 存余数1.。。。往后就是 1、2、0、2、2、1、0、1 重复,详见方法二。

方法一

#include <stdio.h>

int a[1000100] = {1, 2};

int main() {
int n,i;
for(i = 2; i < 1000100; i++) {
a[i] = ( a[i-1] % 3 + a[i-2] % 3) % 3;
}
while ( scanf("%d", &n) != EOF ) {
printf( a
? "no\n" : "yes\n");
}
return 0;
}


方法二

#include <stdio.h>

int main(){
int n;
while( scanf("%d", &n) != EOF ){
if ( n % 4 == 2 ){
puts("yes");
} else {
puts("no");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: