链接:https://www.nowcoder.com/questionTerminal/c0a4b917a15f40a49ca10532ab9019fb
来源:牛客网
NowCoder号称自己已经记住了1-100000之间所有的斐波那契数。
为了考验他,我们随便出一个数n,让他说出第n个斐波那契数。当然,斐波那契数会很大。因此,如果第n个斐波那契数不到6位,则说出该数;否则只说出最后6位。
输入描述:
输入有多组数据。
每组数据一行,包含一个整数n (1≤n≤100000)。
输出描述:
对应每一组输入,输出第n个斐波那契数的最后6位。
示例1
输入
1
2
3
4
100000
输出
1
2
3
5
537501
解题思路:
1.写出斐波那契数列的公式,注意第二位输出的是2;
2.保留后六位,直接%1000000即可,因为加法也是从个位数上开始相加,斐波那契数超过6位就保留6位,没超过%也是本身;
3.超过6位,最后输出6位数,没有超过6位,则直接输出该数,则就要判断斐波那契数是否超6位,此时的n值是多少,即设一个边界值确定。
#include<iostream>
using namespace std;
int main()
{
int border = -1;
long long ans[100000];
ans[0] = 1;
ans[1] = 2;
for(int i = 2; i < 100000; i++)
{
long long next = ans[i - 1] + ans[i - 2];
if(border == -1 && next >= 1000000)
{
border = i + 1; //找到边界,下标与边界关系
}
ans[i] = next % 1000000; //直接取后6位即可
}
int n = 0;
while(cin>>n)
{
long long f = ans[n - 1];
if(n >= border)
{
printf("%06d\n",f);
}
else
{
printf("%d\n",f);
}
}
return 0;
}