客似雲來
鏈接:https://www.nowcoder.com/questionTerminal/3549ff22ae2c4da4890e9ad0ccb6150d
來源:牛客網
題目描述:
NowCoder開了一家早餐店,這家店的客人都有個奇怪的癖好:他們只要來這家店吃過一次早餐,就會每天都過來;並且,所有人在這家店吃了兩天早餐後,接下來每天都會帶一位新朋友一起來品嚐。於是,這家店的客人從最初一個人發展成浩浩蕩蕩成百上千人:1、1、2、3、5……現在,NowCoder想請你幫忙統計一下,某一段時間範圍那他總共賣出多少份早餐(假設每位客人只吃一份早餐)。
輸入描述:
測試數據包括多組。
每組數據包含兩個整數from和to(1≤from≤to≤80),分別代表開店的第from天和第to天。
輸出描述:
對應每一組輸入,輸出從from到to這些天裏(包含from和to兩天),需要做多少份早餐。
題目分析:
- 通過列舉前幾項,可以看到此題是明顯的斐波那契數列應用問題,題目要求對斐波那契數列指定區間項求和。
- 給定輸入範圍是 1≤from≤to≤80,所以在計算過程中要選擇合適的數據類型,防止數據溢出。
- 波那契數列的的前n項和是有一個很有意思的公式,這裏只用結果。
- 斐波那契數列的前n項和,就是第n+2項的值減1。所以,要求第n項到第m項的和,那麼只要求出前m項的和,減去前n - 1項的和,就能得到結果。例如要求第3項到第5項的和,我們就只需要用前5項的和減去前2項的和,而公式中的減一在這個過程中抵消掉了,也就是結果直接就是第7項的值減去第4項的值,這樣我們在操作的時候就更簡單了。就數值而言,第7項是13,第4項是3,差值是10,而2+3+5也是10,結果是正確的。
代碼示例:
循環求和:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<uint64_t> v(80);
v[0]=1;
v[1]=1;
for(int i=2;i<80;++i)
{
v[i]=v[i-1]+v[i-2];
}
int from,to;
while(cin>>from>>to)
{
uint64_t sum=0;
for(int i=from;i<=to;++i)
{
sum+=v[i-1];
}
cout<<sum<<endl;
}
return 0;
}
用前n項和公式求和
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<uint64_t> v(82);
v[0]=1;
v[1]=1;
for(int i=2;i<82;++i)
{
v[i]=v[i-1]+v[i-2];
}
int from,to;
while(cin>>from>>to)
{
uint64_t sum=0;
sum=v[to+1]-v[from];
cout<<sum<<endl;
}
return 0;
}