课后作业
chao_smile 2023/12/30
# 第九课
# 1. 乘坐飞机时,当乘客行李小于等于20公斤时,按每公斤1. 68元收费,大于20公斤时,按每公斤1.98元收费,编程计算收费(保留2位小数)
// 输入输出示例:
// 为详细展示示例,所有的输入都添加了换行,实际编写输入打印可以不换行
// 输出
请输入行李重量(公斤):
// 输入
6
// 输出
行李费用为:10.08元
- 你的答案
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int kg;float sf;
cout <<"请输入行李重量(公斤): ";
cin >> kg;
if(kg <= 20){
sf = kg * 1.68;
}else{
sf = kg * 1.98;
}
printf("行李费用为:%2.2f元",sf);
return 0;
}
结果 仅适用于示例,对于题目来说有瑕疵
解析
- 行李重量不一定为整数,所以使用
int
定义行李重量存在一定问题,导致涉及带小数的行李重量时精度发生错误 printf
格式化参数%2.2f
的意思是打印一个浮点数,至少有两位宽(如果数字较小,前面会有空格填充),且小数点后有两位数字
建议对未要求对齐的需求下使用%.2f
- 行李重量不一定为整数,所以使用
参考答案
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
double weight, fee;
cout << "请输入行李重量(公斤):";
cin >> weight;
if (weight <= 20) {
fee = weight * 1.68;
} else {
fee = weight * 1.98;
}
// `%.2f` 表示要输出的浮点数保留两位小数
printf("行李费用为:%.2f元\n", fee);
return 0;
}
# 2. 一球从某一高度h
落下(单位米),每次落地后反跳回原来高度的一半,再落下。编程计 算气球在第10
次落地时,共经过多少米?第10
次反弹多高?输岀包含两行,第1
行:到球第10
次落地时,一共经过的米数。第2
行:第10
次弹跳的高度
// 输入输出示例:
// 为详细展示示例,所有的输入都添加了换行,实际编写输入打印可以不换行
// 输出
请输入初始高度 h (米):
// 输入
60
// 输出
到球第10次落地时,一共经过的米数: 179.766 米
第10次弹跳的高度: 0.0585938 米
- 你的答案
#include <stdio.h>
//小球落地十次,第一次落地只有下落,后九次有往返
int main()
{
int h,i;
double sum=0,H;
printf("请输入初始高度h(米)");//一定要初始化sum,不然会随机给sum赋值
scanf("%d",&h);
H=h;
sum+=H;//故先将第一次落地的高h加上
for(i=1;i<10;i++)//可以更改i的值,但要保证循环九次
{
sum+=H;//往返一次的总路程其实等于上一次的高度
H=H/2;
}
H=H/2;//第十次弹跳还要另除2
printf("到球第10次落地时,一共经过的米数: %.4lf米\n第10次弹跳的高度: %g米",sum,H);
return 0;
}
结果 仅适用于示例,对于题目来说有瑕疵
解析 输入高度建议使用
double
,毕竟涉及除法且你接收的时候就已经使用double
了,导致涉及带小数的初始高度时精度发生错误参考答案
#include <iostream>
using namespace std;
int main() {
double h, total_distance = 0, current_height;
int n = 10; // 落地次数
cout << "请输入初始高度 h (米): ";
cin >> h;
current_height = h;
for (int i = 1; i <= n; i++) {
total_distance += current_height; // 下落距离
current_height /= 2; // 反弹高度
if (i < n) {
total_distance += current_height; // 上升距离(最后一次不加)
}
}
cout << "到球第10次落地时,一共经过的米数: " << total_distance << " 米" << endl;
cout << "第10次弹跳的高度: " << current_height << " 米" << endl;
return 0;
}
# 3. 求两个正整数m
、n
的最大公约数
# 欧几里得算法(又名:辗转相除法)
什么是最大公约数? 最大公约数(Greatest Common Divisor,简称 GCD),也被称为最大公因数或最大公因子,是指两个或多个整数共有的最大的正整数约数。
以两个整数 m 和 n 为例,它们的最大公约数记为 GCD(m, n)。GCD 的计算方式通常采用欧几里德算法。这个算法的基本思想是:
- 如果 m 能被 n 整除,那么 GCD(m, n) = n;
- 否则,GCD(m, n) = GCD(n, m % n)。
重复这个过程,直到GCD(m, n)中的 n 变为 0,此时的 m 就是最大公约数。
例如,计算 GCD(48, 18):
- 48 不能被 18 整除,于是计算 GCD(18, 48 % 18) = GCD(18, 12);
- 18 不能被 12 整除,于是计算 GCD(12, 18 % 12) = GCD(12, 6);
- 12 不能被 6 整除,于是计算 GCD(6, 12 % 6) = GCD(6, 0)。
当 n 变为 0 时,最大公约数是 6。
最大公约数在数学和计算机科学等领域有着广泛的应用,例如简化分数、求解线性同余方程等。
// 输入输出示例:
// 为详细展示示例,所有的输入都添加了换行,实际编写输入打印可以不换行
// 输出
请输入两个正整数 m 和 n:
// 输入
48 18
// 输出
最大公约数是:6
- 你的答案
#include <iostream>
using namespace std;
int main() {
int m, n, r;
cout <<"请输入两个正整数m和n: ";
cin >> m >> n;
r = m % n;
while (r != 0) {
m = n;
n = r;
r = (m%n);
}
cout << "最大公约数是:" << n << endl;
return 0;
}
结果 完全正确
参考答案
#include <iostream>
using namespace std;
int main() {
int m, n;
cout << "请输入两个正整数 m 和 n:";
cin >> m >> n;
while (n != 0) {
int temp = n;
n = m % n;
m = temp;
}
cout << "最大公约数是:" << m << endl;
return 0;
}
# 4. 给定一个整数n(1 <= n <= 100000000),要求从个位开始分离出它的每一位数字。从个位开始按照从低位到高位的顺序依次输出每一位数字。
// 输入输出示例:
// 为详细展示示例,所有的输入都添加了换行,实际编写输入打印可以不换行
// 输出
请输入一个整数:
// 输入
123654789
// 输出
分离出的每一位数字为:9 8 7 4 5 6 3 2 1
- 你的答案
#include <iostream>
using namespace std;
int main(){
int n;
cout <<"请输入一个整数: ";
cin>>n;
cout <<"分离出的每一位数字为: ";
while(n){
cout<<n%10<<" ";
n/=10;
}
return 0;
}
结果 完全正确
参考答案
#include <iostream>
using namespace std;
int main() {
int n;
cout << "请输入一个整数:";
cin >> n;
cout << "分离出的每一位数字为:";
do {
int digit = n % 10;
cout << digit << " ";
n /= 10;
} while (n != 0);
cout << endl;
return 0;
}
# 5. 计算输入数字的阶乘,当结果大于100
时停止计算
// 输入输出示例:
// 为详细展示示例,所有的输入都添加了换行,实际编写输入打印可以不换行
// 输出
请输入一个整数:
// 输入
6
// 输出
6 的阶乘大于100的最小整数是:5
- 你的答案
#include <iostream>
using namespace std;
int main() {
int num;
cout << "请输入一个整数:";
cin >> num;
long long factorial = 1;
int i = 1;
while (1) {
factorial *= i;
if (factorial > 100) {
break;
}
++i;
}
cout << num << " 的阶乘大于100的最小整数是:" << i << endl;
return 0;
}
结果 完全正确
解析 当阶乘值一旦超过
100
,计算就会停止。这意味着你不需要一个能够存储非常大数值的数据类型。即使对于较小的整数,其阶乘也很快就会超过100
,所以不建议适用long long
类型存储参考答案
#include <iostream>
using namespace std;
int main() {
int num;
cout << "请输入一个整数:";
cin >> num;
int factorial = 1;
int i = 1;
while (true) {
factorial *= i;
if (factorial > 100) {
break;
}
++i;
}
cout << num << " 的阶乘大于100的最小整数是:" << i << endl;
return 0;
}