[編程題]客似雲來

客似雲來

鏈接: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. 通過列舉前幾項,可以看到此題是明顯的斐波那契數列應用問題,題目要求對斐波那契數列指定區間項求和。
  2. 給定輸入範圍是 1≤from≤to≤80,所以在計算過程中要選擇合適的數據類型,防止數據溢出。
  3. 波那契數列的的前n項和是有一個很有意思的公式,這裏只用結果。
  4. 斐波那契數列的前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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章