[每日一题] 66. 客似云来(fib数列公式)
发布日期:2021-05-12 23:14:48 浏览次数:12 分类:精选文章

本文共 1172 字,大约阅读时间需要 3 分钟。

1. 题目来源

链接:

来源:牛客网

2. 题目说明

NowCoder开了一家早餐店,这家店的客人都有个奇怪的癖好:他们只要来这家店吃过一次早餐,就会每天都过来;并且,所有人在这家店吃了两天早餐后,接下来每天都会带一位新朋友一起来品尝。

于是,这家店的客人从最初一个人发展成浩浩荡荡成百上千人:1、1、2、3、5……
现在,NowCoder想请你帮忙统计一下,某一段时间范围那他总共卖出多少份早餐(假设每位客人只吃一份早餐)。

输入描述:

测试数据包括多组。

每组数据包含两个整数from和to(1≤from≤to≤80),分别代表开店的第from天和第to天。

输出描述:

对应每一组输入,输出从from到to这些天里(包含from和to两天),需要做多少份早餐。

3. 题目解析

老样子,先准备好斐波那契的数组,然后遍历那一段数组,求出他们的和即可。而第80项斐波那契数列是一个17位数,所以需要用long long来解决问题。

然而这个题还有另一个更有意思的思路。斐波那契数列的的前n项和其实是有一个很有意思的公式,公式推导在这里,根据文章我们能知道,斐波那契数列的前n项和,就是第n+2项的值减1,例如前10项的和143,就是第12项的144 - 1的结果。所以,我们如果要第n项到第m项的和,那么只要求出前m项的和,减去前n - 1项的和,就能得到结果了。例如要求第3项到第5项的和,我们就只需要用前5项的和减去前2项的和,而公式中的减一在这个过程中抵消掉了,也就是结果直接就是第7项的值减去第4项的值,这样我们在操作的时候就更简单了。 就数值而言,第7项是13,第4项是3,差值是10,而2+3+5也是10,结果是正确的。

4. 代码展示

// write your code here cpp#include 
using namespace std;int main() { long long fib[100001] = { 0}; fib[0] = 1; fib[1] = 1; for (int i = 2; i <= 100000; ++i) { fib[i] = fib[i - 1] + fib[i - 2]; } int n, m; while (cin >> n >> m) { n -= 1; m -= 1; long long count = 0; for (int i = n; i <= m; ++i) count += fib[i]; cout << count << endl; } return 0;}
上一篇:[每日一题] 67. 收件人列表(字符串、cin.get()函数)
下一篇:[每日一题] 65. 剪花布条(字符串、find函数)

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月14日 20时19分25秒