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}\)

证明:

\[\begin{aligned} s &= a_1+a_2+...+a_n \\ s &= a_n+a_{n-1}+...+a_1 \\ 2*s &= (a_1+a_n) + (a_2+a_{n-1}) + ... + (a_n+a_1) \\ \\ s &= \frac{(a_1+a_n)*n}{2}. \end{aligned} \]

其中 \((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;
}
posted @ 2021-08-12 18:47  HelloHeBin  阅读(1459)  评论(0编辑  收藏  举报