天天看點

藍橋杯題解(一)

Problem 1

入門訓練 A+B問題

題目連結

資源限制

時間限制:1.0s 記憶體限制:256.0MB

問題描述

輸入A、B,輸出A+B。

說明:在“問題描述”這部分,會給出試題的意思,以及所要求的目标。

輸入格式

輸入的第一行包括兩個整數,由空格分隔,分别表示A、B。

輸出格式

輸出一行,包括一個整數,表示A+B的值。

樣例輸入

12 45

樣例輸出

57

資料規模與約定

-10000 <= A, B <= 10000。

分析

一道最基礎的入門題,就是A+B problem,C++代碼結構是很簡單的,但是Python代碼需要注意,兩個數字是連着的,不能直接用input輸入,需要用split以空格分隔數字,好的來看代碼

标程

C++:

#include<map>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<iomanip> 
#include<cstring>
#include<iterator>
#include<iostream>
#include<algorithm>
#define R register 
#define LL long long 
using namespace std;

int main(){
    int number_1, number_2;
    scanf("%d%d", &number_1, &number_2);
    printf("%d", number_1 + number_2);
	return 0;
}
           

Python:

number = input().split()
print(int(number[1]) + int(number[0]))
           

Problem 2

試題 入門訓練 序列求和

題目連結

資源限制

時間限制:1.0s 記憶體限制:256.0MB

問題描述

求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類型的整數。

分析

這道題如果使用C++那麼存在資料類型問題,需要使用long long否則資料溢出,使用Python的時候就沒有這個問題。求和過程不能使用逐個求和的方法,否則當數字個數較大的情況下,程式逾時,需要使用等差數列求和公式進行求和。

标程

C++:

#include<map>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<iomanip> 
#include<cstring>
#include<iterator>
#include<iostream>
#include<algorithm>
#define R register 
#define LL long long 
using namespace std;

int main(){
    LL number;
	scanf("%lld", &number);
	LL totle = 0;
	totle = (1 + number) * number / 2;
	cout << totle; 
	return 0;
}

           

Python:

totle = 0
number = int(input())
totle = (1 + number) * number / 2
print(int(totle))
           

Problem 3

試題 入門訓練 圓的面積

題目連結

資源限制

時間限制:1.0s 記憶體限制:256.0MB

問題描述

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

輸入格式

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

輸出格式

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

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

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

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

樣例輸入

4

樣例輸出

50.2654825

資料規模與約定

1 <= r <= 10000。

提示

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

分析

這裡輸出要求是7位數字,那麼就需要對數字進行一些處理後輸出。請注意C++和Python對于輸出固定長度的浮點數的不同的處理方式。

标程

C++:

#include<map>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<iomanip> 
#include<cstring>
#include<iterator>
#include<iostream>
#include<algorithm>
#define R register 
#define LL long long 
#define pi 3.14159265358979323
using namespace std;

int main(){
    int r;
    scanf("%d", &r);
    double area = pi * r * r;
    printf("%.7lf", area);
	return 0;
}

           

Python:

pi = 3.14159265358979323
r = int(input())
area = pi * r * r
print('%.7f' %area)
           

Problem 4

試題 入門訓練 Fibonacci數列

題目連結

資源限制

時間限制:1.0s 記憶體限制:256.0MB

問題描述

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。

分析

斐波那契數列在較大時會超出int的範圍甚至long long的範圍,是以題目需要的是對10007取餘後的結果,并且邊計算邊進行取餘是合理可行的。我們甚至可以将所有需要的結果打表出來,在需要的時候直接取出即可。

标程

C++:

#include<cstdio>
#include<algorithm>
#define R register 
using namespace std;

int number[1020000];
const int mod=10007;

int main(){
	number[1]=1,number[0]=1;
	for(R int i=2;i<=1000000;++i){
		number[i]=(number[i-1]+number[i-2])%mod;
	}
	int n;
	scanf("%d",&n); 
	printf("%d",number[n-1]);
	return 0;
} 
           

Python:

第一種解法用疊代的方法求出:

f1 = 1
f2 = 1
f3 = 2
n = input()
if int(n) == 1 or int(n) == 2:
    print(1)
else:
    for i in range(int(n)-2):
        f3 = (f1 + f2) % 10007
        f1 = f2
        f2 = f3
    print(f3)
           

第二種解法用list清單來解:

f = [1, 1]
n = int(input())
if n == 1 or n == 2:
    print(1)
else:
    for i in range(2, n):
        f.append((f[i - 1] % 10007 + f[i - 2] % 10007) % 10007)
    print(f[n - 1])