这个题要想不超时,关键在于找到循环起始点与循环体长度。
题目描述
斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、…… 在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。鹏鹏最近重新温习了一下斐波那契数列,然后他想到了一个问题,如果把数列的前两项写在一行,后面每个数字都是前两个数字的和,那么数列的第n个数字是几呢?例如,当前两项为0和1的时候,数列可以写成下面形式:011235813471123581347112358……
输入
输入包含多组测试数据,每组数据为三个正整数a, b, n(0≤a, b < 10,0<n<10^9),分别代表数列的前两项和需要计算的项数。
输出
示例输入
0 1 3 0 1 7 1 1 8
示例输出
1 8 3
提示
来源
qc
示例程序
#include <stdio.h>
int a[100];
int main()
{
int s, b, n, i, c, j, x, y, z;
while(scanf("%d%d%d",&s,&b,&n)!=EOF)
{
z = 0;
a[0] = s;
a[1] = b;
for(i = 2; i < n; i++)
{
a[i] = a[i-1]+a[i-2];
if(a[i]>=10)
{
c = a[i];
a[i] = a[i] / 10;
a[i+1] = c % 10;
i++;
}
for(j = 0; j < i - 1; j++)
{
if(a[i]==a[j+1]&&a[i-1]==a[j])
{
x = j;
y = i - 1 - j;
z = 1;
break;
}
}
if(z)
break;
}
if(z==0)
printf("%d\n",a[n-1]);
else
printf("%d\n",a[(n-1-x)%y+x]);
}
return 0;
}