1.4 順序結構實例
1.4 順序結構實例
P5703 【深基2.例5】蘋果采購
題目描述
現在需要采購一些蘋果,每名同學都可以分到固定數量的蘋果,并且已經知道了同學的數量,請問需要采購多少個蘋果?
輸入格式:輸入兩個不超過 \(10^9\) 正整數,分別表示每人分到的數量和同學的人數。
輸出格式:一個整數,表示答案。保證輸入和答案都在 int 范圍內的非負整數。
| 輸入樣例 | 輸出樣例 |
|---|---|
5 3 | 15 |
分析:總價 = 單價 x 數量。
#include<iostream>
using namespace std;
int main() {
int a,b;
cin>>a>>b;
cout<<a*b;
return 0;
}
P5704 【深基2.例6】字母轉換
題目描述
輸入一個小寫字母,輸出其對應的大寫字母。例如輸入 q[回車] 時,會輸出 Q。
| 輸入樣例 | 輸出樣例 |
|---|---|
q | Q |
分析:字符都是以ASCII的形式存儲在計算機中,小寫字母比其對應大寫字母的ASCII碼大 32,另外還有數字和字符的轉化。
#include<iostream>
using namespace std;
int main(){
char ch; cin>>ch;
cout<<(char)(ch-32);
return 0;
}
P5705 【深基2.例7】數字反轉
題目描述
輸入一個不小于 \(100\) 且小于 \(1000\),同時包括小數點后一位的一個浮點數,例如 \(123.4\) ,要求把這個數字翻轉過來,變成 \(4.321\) 并輸出。
輸入格式: 一行一個浮點數
輸出格式: 一行一個浮點數
| 輸入樣例 | 輸出樣例 |
|---|---|
123.4 | 4.321 |
分析:除以10刪除個位,模10取個位。
#include<iostream>
using namespace std;
int main(){
// char a,b,c,d,e;
// cin>>a>>b>>c>>d>>e;
// cout<<e<<d<<c<<b<<a;
double num; cin>>num;
int n = num*10;
int a = n%10;
int b = n/10%10;
int c = n/100%10;
int d = n/1000;
num = a + b*0.1 + c*0.01 + d*0.001;
cout<<num;
return 0;
}
P5706 【深基2.例8】再分肥宅水
題目描述
現在有 \(t\) 毫升肥宅快樂水,要均分給 \(n\) 名同學,每名同學需要 \(2\) 個杯子。現在想知道每名同學可以獲得多少毫升飲料(嚴格精確到小數點后 \(3\) 位),以及一共需要多少個杯子。
輸入格式: 輸入一個實數 \(t\) 和一個正整數 \(n\),使用空格隔開。
輸出格式: 輸出兩行。
第一行輸出一個三位小數,表示可以獲得多少毫升飲料。
第二行輸出一個正整數,表示一共需要多少個杯子。
| 輸入樣例 | 輸出樣例 |
|---|---|
500.0 3 | 166.667 6 |
提示:對于所有數據,\(0\leq t\leq 10000\) 且小數點后不超過 \(3\) 位,\(1\leq n\leq 1000\)。
分析
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
double t; int n; cin>>t>>n;
cout<<fixed<<setprecision(3)<<t/n<<endl;
cout<<2*n<<endl;
return 0;
}
P5708 【深基2.習2】三角形面積
題目描述
一個三角形的三邊長分別是 \(a\)、\(b\)、\(c\),那么它的面積為 \(\sqrt{p(p-a)(p-b)(p-c)}\),其中 \(p=\frac{1}{2}(a+b+c)\)。輸入這三個數字,計算三角形的面積,四舍五入精確到 \(1\) 位小數。
輸入格式: 第一行輸入三個實數 \(a,b,c\),以空格隔開。
輸出格式: 輸出一個實數,表示三角形面積。精確到小數點后 \(1\) 位。
| 輸入樣例 | 輸出樣例 |
|---|---|
3 4 5 | 6.0 |
提示:數據保證能構成三角形,\(0\leq a,b,c\leq 1000\),每個邊長輸入時不超過 \(2\) 位小數。
分析
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main(){
double a,b,c,p; cin>>a>>b>>c;
p = (a+b+c)/2; // 海倫公式
double s = sqrt(p*(p-a)*(p-b)*(p-c));
cout<<fixed<<setprecision(1)<<s;
return 0;
}
P1425 小魚的游泳時間
題目描述
倫敦奧運會要到了,小魚在拼命練習游泳準備參加游泳比賽,可憐的小魚并不知道魚類是不能參加人類的奧運會的。
這一天,小魚給自己的游泳時間做了精確的計時(本題中的計時都按 \(24\) 小時制計算),它發現自己從 \(a\) 時 \(b\) 分一直游泳到當天的 \(c\) 時 \(d\) 分,請你幫小魚計算一下,它這天一共游了多少時間呢?
小魚游的好辛苦呀,你可不要算錯了哦。
輸入格式: 一行內輸入 \(4\) 個整數,以空格隔開,分別表示題目中的 \(a, b, c, d\)。
輸出格式: 一行內輸出 \(2\) 個整數 \(e\) 和 \(f\),用空格間隔,依次表示小魚這天一共游了多少小時多少分鐘。其中表示分鐘的整數 \(f\) 應該小于 \(60\)。
| 輸入樣例 | 輸出樣例 |
|---|---|
12 50 19 10 | 6 20 |
提示:對于全部測試數據,\(0\le a,c \le 24\),\(0\le b,d \le 60\),且結束時間一定晚于開始時間。
分析
這是一個接近生活的小問題,計算公交車的運行時間,都知道計算方式為:結束時間 - 開始時間;
結束時間 \(= c*60+d\), 開始時間 \(= a*60+b\);
運行時間:\(time = c*60+d - (a*60+b)\);
\(e=time/60, f=time\%60\);
#include<iostream>
using namespace std;
int main(){
int a,b,c,d,e,f;
cin>>a>>b>>c>>d;
int time=c*60+d - (a*60+b);
e = time/60, f = time%60;
cout<<e<<" "<<f;
return 0;
}
P1421 小玉買文具
題目描述
班主任給小玉一個任務,到文具店里買盡量多的簽字筆。已知一只簽字筆的價格是 \(1\) 元 \(9\) 角,而班主任給小玉的錢是 \(a\) 元 \(b\) 角,小玉想知道,她最多能買多少只簽字筆呢。
輸入格式: 輸入只有一行兩個整數,分別表示 \(a\) 和 \(b\)。
輸出格式: 輸出一行一個整數,表示小玉最多能買多少只簽字筆。
| 輸入樣例 | 輸出樣例 |
|---|---|
10 3 | 5 |
提示:對于全部的測試點,保證 \(0 \leq a \leq 10^4\),\(0 \leq b \leq 9\)。
分析
這里主要的是單位問題,一般來說轉化為小單位更方便計算,這樣可以保證精度不損失。比如,我們轉化為角,所以總金額 \(= a*10+b\),簽字筆單價 = \(1*10+9=19\) 角。
則可以購買的簽字筆數量 = 總金額 / 單價,\(n=(a*10+b)/19\),但是簽字筆數量不可能為小數,所以需要向下取整。
\(floor(n)\):向下取整 \(\lfloor n \rfloor\), 取到不大于 \(n\) 的最大整數。
\(ceil(n)\):向上取整 \(\lceil n \rceil\), 取到不小于于 \(n\) 的最小整數。
#include<iostream>
using namespace std;
int main() {
int a,b; cin>>a>>b;
int money2 = a*10+b;
cout<<money2/19;
return 0;
}
數的冪
題目描述
輸入四個正整數 \(a,b,c,n \ (a,b,c<200, n≤6)\),求 \(a^n+b^n+c^n\)。
提示:\(a^n = a*a*...*a\),也就是 \(n\) 個 \(a\) 的乘積,被稱作 \(a\) 的 \(n\)次冪,可以使用函數:\(a^n= pow(a,n);\)
輸入格式: 輸入四個正整數 \(a,b,c,n\)
輸出格式: 一個整數
| 輸入樣例 | 輸出樣例 |
|---|---|
34 56 7 5 | S=596184007 |
分析:
其中 \(a^n+b^n+c^n\) 最大情況為 \(3*200^6=1.92*10^{14} > \text{INT_MAX}\),所以需要開 long long.
#include<iostream>
#include<cmath>
using namespace std;
int main() {
long long a,b,c,n; cin>>a>>b>>c>>n;
long long res=pow(a,n)+pow(b,n)+pow(c,n);
cout<<res;
return 0;
}
等差數列
題目描述
給定整數等差數列的首項 \(a\) 和末項 \(b\) 以及項數 \(n\),求等差數列各項的總和。
數據范圍:\(0<=a, b<=10^9, n<=200\)。
輸入格式: 輸入三個正整數 \(a,b,n\)
輸出格式: 一個整數
| 輸入樣例 | 輸出樣例 |
|---|---|
5 10005 5 | 25025 |
分析
有數列 \(\{a_1,a_2,...,a_n\}\),對于任意 \(i\) 有 \(a_{i+1}-a_i=d\),則稱數列 \(a_i\) 為等差數列。
等差數列性質:\(a_n=a_1+(n-1)*d\)
求和公式:\(sum = a_1+a_2+...+a_n = \frac{(a_1+a_n)*n}{2}\)。
證明:
其中 \((a_1+a_n)*n\) 最大情況為 \(10^9*10^9*200=2*10^{20} > \text{INT_MAX}\),需要開 long long。
#include<iostream>
using namespace std;
int main() {
long long a,b,n; cin>>a>>b>>n;
long long res=(a+b)*n/2;
cout<<res;
return 0;
}

浙公網安備 33010602011771號