1. 程式人生 > 實用技巧 >藍橋杯入門訓練

藍橋杯入門訓練

Fibonacci數列

1. 問題描述

Fibonacci數列的遞推公式為:Fn=Fn-1+Fn-2,其中F1=F2=1。

當n比較大時,Fn也非常大,現在我們想知道,Fn除以10007的餘數是多少。

輸入格式

輸入包含一個整數n。

輸出格式

輸出一行,包含一個整數,表示Fn除以10007的餘數。

說明:在本題中,答案是要求Fn除以10007的餘數,因此我們只要能算出這個餘數即可,而不需要先計算出Fn的準確值,再將計算的結果除以10007取餘數,直接計算餘數往往比先算出原數再取餘簡單。

樣例輸入

10

樣例輸出

55

樣例輸入

22

樣例輸出

7704

資料規模與約定

1 <= n <= 1,000,000。

2. 解題思路

求Fibonacc數列首先會想到的就是用遞迴,但是用遞迴先算出第n個數的這種做法並不符合題意,總還用更簡單的做法。苦想無果後,找到一篇大神的解法,程式碼十分簡潔明瞭。

#include <iostream>

using namespace std;

int main(){
  int n;
  long long f,f1 = 1,f2 = 1;
  //獲取使用者輸入
  cin >> n;
  for(int i = 2 ; i < n ; i++){
    f = (f1+f2)%10007;
    f1 = f2;
    f2 = f;

  }
  cout << f << endl;
}

在這裡,直接對每個數進行取餘操作,只有當碰到大於10007的數才能有餘數,遇到比10007小的數經過 f = (f1+f2)%10007操作後第i位數的值不變,其次,當第i位數超過10007時才能繼續進行取餘。一直進行到將其取完為止。

此題主要難以想象的點就在於 f = (f1+f2)%10007,其實就是一個簡單的數學除法問題,只要理解了取餘操做,那麼其計算過程也不難理解,在稿紙上列寫一個計算一下10946%1007的計算過程。10946 = 10007 + 939,當你要計算下一位Fibonacci數列時,用939+7704,直接在餘數後面進行加。仔細推敲計算的過程,會發現,這種計算過程的巧妙之處。

圓的面積

1. 問題描述

給定圓的半徑r,求圓的面積。

輸入格式

輸入包含一個整數r,表示圓的半徑。

輸出格式

輸出一行,包含一個實數,四捨五入保留小數點後7位,表示圓的面積。

說明:在本題中,輸入是一個整數,但是輸出是一個實數。

對於實數輸出的問題,請一定看清楚實數輸出的要求,比如本題中要求保留小數點後7位,則你的程式必須嚴格的輸出7位小數,輸出過多或者過少的小數位數都是不行的,都會被認為錯誤。

實數輸出的問題如果沒有特別說明,舍入都是按四捨五入進行。

樣例輸入

4

樣例輸出

50.2654825

資料規模與約定

1 <= r <= 10000。

提示

本題對精度要求較高,請注意π的值應該取較精確的值。你可以使用常量來表示π,比如PI=3.14159265358979323,也可以使用數學公式來求π,比如PI=atan(1.0)*4。

2. 解題思路

一切盡在程式碼中

#include <iostream>
#include <cmath>
using namespace std;
const double PI =3.14159265358979323;
int main (){
  int r;//圓的面積
  cin >> r;
  printf("%.7lf\n",PI*r*r);
}

序列求和

1. 題目描述

求1+2+3+...+n的值。

輸入格式

輸入包括一個整數n。

輸出格式

輸出一行,包括一個整數,表示1+2+3+...+n的值。

樣例輸入

4

樣例輸出

10

樣例輸入

100

說明:有一些試題會給出多組樣例輸入輸出以幫助你更好的做題。

一般在提交之前所有這些樣例都需要測試通過才行,但這不代表這幾組樣例資料都正確了你的程式就是完全正確的,潛在的錯誤可能仍然導致你的得分較低。

樣例輸出

5050

資料規模與約定

1 <= n <= 1,000,000,000。

說明:請注意這裡的資料規模。

本題直接的想法是直接使用一個迴圈來累加,然而,當資料規模很大時,這種“暴力”的方法往往會導致超時。此時你需要想想其他方法。你可以試一試,如果使用1000000000作為你的程式的輸入,你的程式是不是能在規定的上面規定的時限內執行出來。

本題另一個要值得注意的地方是答案的大小不在你的語言預設的整型(int)範圍內,如果使用整型來儲存結果,會導致結果錯誤。

如果你使用C++或C語言而且準備使用printf輸出結果,則你的格式字串應該寫成%I64d以輸出long long型別的整數。

2. 解題思路

可以將其看成d = 1的等差數列,則SUM(n) = n*(1+n)/2

#include <iostream>

using namespace std;

int main(){
  long long n;
  cin >> n;
  printf("%lld\n",n*(1+n)/2);
}

日常做題太少了,總以為自己學的還行,其實就是個半罈子水,教我C語言的老師也常提醒我多做題,提高程式設計能力,起初不以為意,等到了要比賽了,再做題的時候才發現自己欠缺的太多了。好多東西都只是學了個皮毛,時間一長就忘了,希望看到這篇博文的同學不要再走我的老路了,紮紮實實做題,哪怕一週只做了很少量的題,也比不做題強。