2025-4-11-C++ 学习 分支结构(下)
2025-4-11-C++学习 分支结构(下)
继续,题目有点难度了,需要考虑的东西变多了。
P5717 【深基3.习8】三角形分类
题目描述
给出三条线段 a , b , c a,b,c a,b,c 的长度,均是不大于 10000 10000 10000 的正整数。打算把这三条线段拼成一个三角形,它可以是什么三角形呢?
- 如果三条线段不能组成一个三角形,输出
Not triangle
; - 如果是直角三角形,输出
Right triangle
; - 如果是锐角三角形,输出
Acute triangle
; - 如果是钝角三角形,输出
Obtuse triangle
; - 如果是等腰三角形,输出
Isosceles triangle
; - 如果是等边三角形,输出
Equilateral triangle
。
如果这个三角形符合以上多个条件,请按以上顺序分别输出,并用换行符隔开。
输入格式
输入 3 个整数 a a a、 b b b 和 c c c。
输出格式
输出若干行判定字符串。
输入输出样例 #1
输入 #1
3 3 3
输出 #1
Acute triangle
Isosceles triangle
Equilateral triangle
输入输出样例 #2
输入 #2
3 4 5
输出 #2
Right triangle
输入输出样例 #3
输入 #3
6 10 6
输出 #3
Obtuse triangle
Isosceles triangle
输入输出样例 #4
输入 #4
1 14 5
输出 #4
Not triangle
说明/提示
当两短边的平方和大于一长边的平方,说明是锐角三角形。
当两短边的平方和等于一长边的平方,说明是直角三角形。
当两短边的平方和小于一长边的平方,说明是钝角三角形。
题解代码
挺有趣的题目,感觉像是在 复习小学数学运算。
#include <bits/stdc++.h>
using namespace std;
void swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a, b, c;
cin >> a >> b >> c;
if ( a > b)
{
swap(a,b);
}
if ( a > c)
{
swap(a,c);
}
if(b > c)
{
swap(b,c);
}
if((a+b>c)&&(a+c>b)&&(b+c>a))
{
if((a*a + b*b )== c*c)
{
cout << "Right triangle" << endl;
}
else if((a*a + b*b ) > c*c)
{
cout << "Acute triangle" << endl;
}
else if((a*a + b*b ) < c*c )
{
cout << "Obtuse triangle" << endl;
}
if(a == b || b == c || a == c)
{
cout << "Isosceles triangle" << endl;
}
if(a == b && b == c)
{
cout << "Equilateral triangle" <<endl;
}
}
else
{
cout << "Not triangle" << endl;
}
return 0;
}
P1422 小玉家的电费
题目描述
夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了。小玉家今天收到了一份电费通知单。小玉看到上面写:据闽价电 [2006]27 号规定,月用电量在 150 150 150 千瓦时及以下部分按每千瓦时 0.4463 0.4463 0.4463 元执行,月用电量在 151 ∼ 400 151\sim 400 151∼400 千瓦时的部分按每千瓦时 0.4663 0.4663 0.4663 元执行,月用电量在 401 401 401 千瓦时及以上部分按每千瓦时 0.5663 0.5663 0.5663 元执行。小玉想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少。
输入格式
输入一个正整数,表示用电总计(单位以千瓦时计),不超过 10000 10000 10000。
输出格式
输出一个数,保留到小数点后 1 1 1 位(单位以元计,保留到小数点后 1 1 1 位)。
输入输出样例 #1
输入 #1
267
输出 #1
121.5
题解代码
典型的数学题,分类讨论。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a;
cin >> a;
double ans;
if (a <= 150)
{
ans = a * 0.4463;
}
if(a > 150 && a <= 400)
{
ans = 150*0.4463 + (a - 150) * 0.4663;
}
if(a > 400)
{
ans = 150*0.4463 + 250*0.4663 + (a-400)*0.5663;
}
cout << fixed << setprecision(1) << ans << endl;
return 0;
}
P1424 小鱼的航程(改进版)
题目背景
题目描述
有一只小鱼,它平日每天游泳 250 250 250 公里,周末休息(实行双休日),假设从周 x x x 开始算起,过了 n n n 天以后,小鱼一共累计游泳了多少公里呢?
输入格式
输入两个正整数 x , n x,n x,n,表示从周 x x x 算起,经过 n n n 天。
输出格式
输出一个整数,表示小鱼累计游泳了多少公里。
输入输出样例 #1
输入 #1
3 10
输出 #1
2000
说明/提示
数据保证, 1 ≤ x ≤ 7 1\le x \le 7 1≤x≤7, 1 ≤ n ≤ 1 0 6 1 \le n\le 10^6 1≤n≤106。
题解代码
用的是模拟过程的办法。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x, n;
cin >> x >> n;
int ans = 0;
x -= 1;
while(n > 0)
{
if(x<5)
{
ans += 250;
}
x++;
x %=7;
n--;
}
cout << ans << endl;
return 0;
}
P1888 三角函数
题目描述
输入一组勾股数 a , b , c ( a ≠ b ≠ c ) a,b,c(a\neq b\neq c) a,b,c(a=b=c),用分数格式输出其较小锐角的正弦值。(要求约分。)
输入格式
一行,包含三个正整数,即勾股数 a , b , c a,b,c a,b,c(无大小顺序)。
输出格式
一行,包含一个分数,即较小锐角的正弦值
输入输出样例 #1
输入 #1
3 5 4
输出 #1
3/5
说明/提示
数据保证: a , b , c a,b,c a,b,c 为正整数且 ∈ [ 1 , 1 0 9 ] \in [1,10^9] ∈[1,109]。
题解代码
这个题有趣的很,可以好好复习一下求取最大公约数的方法,辗转相除法,同时可以调用已有的函数 __gcd(a,b)
。
#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b)
{
int aa = a,bb = b;
while(aa != bb)
{
if(aa > bb)
{
aa = aa - bb;
}
else
{
bb = bb - aa;
}
}
return aa;
}
int main()
{
int a[3], factor;
for(int k1=0;k1<3;++k1)
{
cin >> a[k1];
}
sort(a,a+3);
factor = gcd(a[0],a[2]);
cout << a[0] / factor << "/" << a[2] / factor << endl;
return 0;
}
P1046 [NOIP 2005 普及组] 陶陶摘苹果
题目描述
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10 10 10 个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 30 30 30 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知 10 10 10 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
输入格式
输入包括两行数据。第一行包含 10 10 10 个 100 100 100 到 200 200 200 之间(包括 100 100 100 和 200 200 200)的整数(以厘米为单位)分别表示 10 10 10 个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个 100 100 100 到 120 120 120 之间(包含 100 100 100 和 120 120 120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
输出格式
输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
输入输出样例 #1
输入 #1
100 200 150 140 129 134 167 198 200 111
110
输出 #1
5
说明/提示
【题目来源】
NOIP 2005 普及组第一题
题解代码
条件列好,挺好判断的。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[10],h;
for (int k1=0;k1<10;++k1)
{
cin >> a[k1];
}
cin >> h;
int ans = 0;
for (int k1=0;k1<10;++k1)
{
if(a[k1] <= (h + 30))
{
ans++;
}
}
cout << ans << endl;
return 0;
}
P4414 [COCI 2006/2007 #2] ABC
题目描述
三个整数分别为 A , B , C A,B,C A,B,C。这三个数字不会按照这样的顺序给你,但它们始终满足条件: A < B < C A < B < C A<B<C。为了看起来更加简洁明了,我们希望你可以按照给定的顺序重新排列它们。
输入格式
第一行包含三个正整数 A , B , C A,B,C A,B,C,不一定是按这个顺序。这三个数字都小于或等于 100 100 100。第二行包含三个大写字母 A A A、 B B B 和 C C C(它们之间没有空格)表示所需的顺序。
输出格式
在一行中输出
A
A
A,
B
B
B 和
C
C
C,用一个
(空格)隔开。
感谢 @smartzzh 提供的翻译
输入输出样例 #1
输入 #1
1 5 3
ABC
输出 #1
1 3 5
输入输出样例 #2
输入 #2
6 4 2
CAB
输出 #2
6 2 4
题解代码
三个循环,写起来稍微有点费劲。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[3];
for(int k1=0;k1<3;++k1)
{
cin >> a[k1];
}
char ch[3];
for(int k1=0;k1<3;++k1)
{
cin >> ch[k1];
}
sort(a,a+3);
for(int k1=0;k1<3;++k1)
{
if (ch[k1] == 'A') cout << a[0] << " ";
if (ch[k1] == 'B') cout << a[1] << " ";
if (ch[k1] == 'C') cout << a[2] << " ";
}
return 0;
}
P1055 [NOIP 2008 普及组] ISBN 号码
题目描述
每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括
9
9
9 位数字、
1
1
1 位识别码和
3
3
3 位分隔符,其规定格式如 x-xxx-xxxxx-x
,其中符号 -
就是分隔符(键盘上的减号),最后一位是识别码,例如 0-670-82162-4
就是一个标准的 ISBN 码。ISBN 码的首位数字表示书籍的出版语言,例如
0
0
0 代表英语;第一个分隔符 -
之后的三位数字代表出版社,例如
670
670
670 代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以
1
1
1 加上次位数字乘以
2
2
2 ……以此类推,用所得的结果 $ \bmod 11$,所得的余数即为识别码,如果余数为
10
10
10,则识别码为大写字母
X
X
X。例如 ISBN 号码 0-670-82162-4
中的识别码
4
4
4 是这样得到的:对 067082162
这
9
9
9 个数字,从左至右,分别乘以
1
,
2
,
…
,
9
1,2,\dots,9
1,2,…,9 再求和,即
0
×
1
+
6
×
2
+
…
…
+
2
×
9
=
158
0\times 1+6\times 2+……+2\times 9=158
0×1+6×2+……+2×9=158,然后取
158
m
o
d
11
158 \bmod 11
158mod11 的结果
4
4
4 作为识别码。
你的任务是编写程序判断输入的 ISBN 号码中识别码是否正确,如果正确,则仅输出 Right
;如果错误,则输出你认为是正确的 ISBN 号码。
输入格式
一个字符序列,表示一本书的 ISBN 号码(保证输入符合 ISBN 号码的格式要求)。
输出格式
一行,假如输入的 ISBN 号码的识别码正确,那么输出 Right
,否则,按照规定的格式,输出正确的 ISBN 号码(包括分隔符 -
)。
输入输出样例 #1
输入 #1
0-670-82162-4
输出 #1
Right
输入输出样例 #2
输入 #2
0-670-82162-0
输出 #2
0-670-82162-4
说明/提示
2008 普及组第一题
题解代码
这道题考虑的有点欠缺了,主要是问题太长了,不过也怪自己不仔细,
要把控住输入与输出,中间过程可以自己试着灵活调控。
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[13];
int b[10];
int idx = 0;
for (int k1=0;k1<13;++k1)
{
cin >> a[k1];
if((a[k1] >= '0' && a[k1] <= '9') || a[k1] == 'X')
{
if(idx<10)
{
if(a[k1] == 'X')
{
b[idx] = 10;
}
else
{
b[idx] = a[k1] - '0';
}
}
idx++;
}
}
int ansNum = 0;
for(int k1=0;k1<9;++k1)
{
ansNum += b[k1]*(k1+1);
}
int ans = 0;
int endNum = ansNum % 11;
if (endNum == b[9])
{
ans = 1;
}
if(ans == 1)
{
cout << "Right" << endl;
}
else
{
for(int k1=0;k1<12;++k1)
{
cout << a[k1];
}
if(endNum == 10)
{
cout << 'X' << endl;
}
else
{
cout << endNum <<endl;
}
}
return 0;
}