题意是说在给定的一种满足每一项等于前两项之和的数列中,判断第 n 项的数字是否为 3 的倍数。
斐波那契数在到第四十多位的时候就会超出 int 存储范围,但是题目问的是是否为 3 的倍数,也就是模 3 值为 0 ,考虑到余数只有0,1,2,而且每项由前两项求和得到,也就是说余数一定会出现循环的规律,从首项开始,前 8 项模 3 的结果是:1 2 0 2 2 1 0 1,接下来的两项模 3 的结果仍是 1 2 ,那么整个序列就呈现出以 8 为周期的特点,只要模 8 的结果为 3 或者 7 就输出 yes,否则输出 no,注意序列是从第 0 项开始的,所以 n 每次都要减掉 1.
1 #include <cstdio> 2 int main() 3 { 4 int n; 5 while(~scanf("%d",&n)) 6 { 7 // if(n == 0 || n == 1) puts("no"); 8 // else 9 // { 10 // n -= 2; 11 // if(n % 4 == 0) puts("yes"); 12 // else puts("no"); 13 // } 14 n++; 15 if(n%8 == 3 || n%8 == 7) puts("yes"); 16 else puts("no"); 17 } 18 return 0; 19 }