课后作业

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;
}
  • 结果 仅适用于示例,对于题目来说有瑕疵

  • 解析

    1. 行李重量不一定为整数,所以使用int定义行李重量存在一定问题,导致涉及带小数的行李重量时精度发生错误
    2. 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. 求两个正整数mn的最大公约数

# 欧几里得算法(又名:辗转相除法)

什么是最大公约数? 最大公约数(Greatest Common Divisor,简称 GCD),也被称为最大公因数或最大公因子,是指两个或多个整数共有的最大的正整数约数。
以两个整数 m 和 n 为例,它们的最大公约数记为 GCD(m, n)。GCD 的计算方式通常采用欧几里德算法。这个算法的基本思想是:

  1. 如果 m 能被 n 整除,那么 GCD(m, n) = n;
  2. 否则,GCD(m, n) = GCD(n, m % n)。

重复这个过程,直到GCD(m, n)中的 n 变为 0,此时的 m 就是最大公约数。
例如,计算 GCD(48, 18):

  1. 48 不能被 18 整除,于是计算 GCD(18, 48 % 18) = GCD(18, 12);
  2. 18 不能被 12 整除,于是计算 GCD(12, 18 % 12) = GCD(12, 6);
  3. 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时停止计算

1
// 输入输出示例:
// 为详细展示示例,所有的输入都添加了换行,实际编写输入打印可以不换行
// 输出
请输入一个整数:
// 输入
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;
}
上次更新: 2024-10-19 10:01:51