课后作业

2023/11/18

# 第五课

# 1.甲、乙、丙三人共有 24 元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。设甲、乙、丙三人的钱数分别为 abc。用逆推算法,从最后结果入手,按反相顺序,分步骤推算出每次各人当时的钱数:

小提示:
使用倒推法(代数逆序)从最后结果入手,按反向顺序,分步骤推算出每次分钱每个人的钱数
"所分给的数与各人已有数相同"的意思是:以第一次为例,甲给乙:给了乙已有数(当时自身所拥有全部的钱数),所以给过后乙的钱翻倍了

// 输出示例:
a = 13 b = 7 c = 4
  • 你的答案
#include<cstdio>
using namespace std;
int main() {
	int a=8,b=8,c=8;
	a/=2;b/=2;c=a+b+c;
	a/=2;c/=2;b=a+b+c;
	b/=2;c/=2;a=a+b+c;
	printf("a=%d\tb=%d\tc=%d\n",a,b,c);
}
  • 解析
    这是一个逆推算法的问题,我们可以从最后的结果开始,然后反向推导出每一步的结果。在这个问题中,我们知道最后每个人的钱数是相同的,所以我们可以假设最后每个人都有 8 元(24/3=8)。然后我们可以反向推导出每一步的结果。
  • 参考答案
    无,答案程序输出完全正解

# 2.输入三条线段的长度,判断这三条线段是否能够构成三角形。如果能够构成,则计算其面积。

小提示:使用海伦公式(Heron's formula)求解

海伦公式(Heron's formula)
5-1
// 输入输出示例:
// 示例1
请输入三条线段的长度:
第一条边: 1
第二条边: 2
第三条边: 3
不能构成三角形。
// 示例2
请输入三条线段的长度:
第一条边: 2
第二条边: 3
第三条边: 4
可以构成三角形,其面积为: 2.90474
  • 你的答案
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int a,b,c;
	cout << "请输入这三条边的长度:\n";
	cout << "第一条:" ;
	cin>>a;
	cout << "第二条:" ;
	cin>>b;
	cout << "第三条:" ;
	cin>>c;
	if((a+b>c)&&(a+c>b)&&(b+c>a))
		cout<<calculateTriangleArea(a,b,c);
		else
			cout<<"不能构成三角形";
	return 0;
}
  • 解析
    1. 当前程序报错
    main.cpp: In function ‘int main():
    main.cpp:23:23: error: ‘calculateTriangleArea’ was not declared in this scope
    23 |                 cout<<calculateTriangleArea(a,b,c);
       |                       ^~~~~~~~~~~~~~~~~~~~~
    
    这个错误提示表明你的代码中存在一个错误。错误提示信息指出 calculateTriangleArea 函数在 main 函数的作用域中没有被声明。这意味着编译器无法找到 calculateTriangleArea 函数的定义。要解决这个错误,你需要确保 calculateTriangleArea 函数在 main 函数使用之前被定义。
    在题目提示中出现的 calculateTriangleArea 为自定义函数名称,本质是想你根据提供的面积公式说明同时调用sqrt(平方根值函数)去进行计算
    2. 当前程序运行结果不符合输入输出示例 此题主要考查平方根值函数的使用。
    习题完成后应运行查看运行结果,将calculateTriangleArea当作cmath已有函数来看程序没有问题。
    非常抱歉,下次我会详细检查引入素材是否存在多余部分
  • 参考答案
#include <iostream>
#include <cmath>
using namespace std;

int main() {
    // 输入三条线段的长度
    double side1, side2, side3;
    cout << "请输入三条线段的长度:" << endl;
    cout << "第一条边: ";
    cin >> side1;
    cout << "第二条边: ";
    cin >> side2;
    cout << "第三条边: ";
    cin >> side3;
    // 判断是否构成三角形
    const bool constitute=side1 + side2 > side3 && side1 + side3 > side2 && side2 + side3 > side1;
    if(!constitute){
        cout << "不能构成三角形。" << endl;
        return 0;
    };
    // 计算半周长
    double s =(side1 + side2 + side3) / 2;
    // 使用海伦公式计算面积
    double area = sqrt(s * (s - side1) * (s - side2) * (s - side3));
    cout << "可以构成三角形,其面积为: " << area << endl;
    return 0;
}

# 3.有一个等差数列的前五项分别是 3, 6, 9, 12, 15,请编写程序计算并输出这个等差数列的公差和首项,同时输入一个数实现判断其是否符合此等差数列,如何符合的话继续输出其数字位于第几项。

小提示:等差数列(Arithmetic Progression/AP)是一种数学数列,其中每一项与前一项之差都相等。这个固定的差值称为公差。首项指的是第一项

// 输入输出示例:
// 示例1
首项为: 3
公差为: 3
输入数字:28
28 不符合这个等差数列的规律。
// 示例2
首项为: 3
公差为: 3
输入数字:27
是的,27符合这个等差数列的规律,它是该等差数列的第9
  • 你的答案
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
	int sx , gc;
	cout <<"首项为:";
	cin >> sx;
	cout <<"公差为: ";
	cin >> gc;
	int a ;
	cout <<"输入数字: ";
	cin >> a;
	if (a % gc)
	printf ("是的,%d符合这个等差数列的规律,它是等差数列的第%d项",a,a % gc);
	else
	printf ("%d不符合规律",a) ;
	return 0;
}
  • 解析

    1. 运行结果不符合输出示例,注意阅读题目,输出这个等差数列的公差和首项输入一个数实现判断其是否符合此等差数列,如何符合的话继续输出其数字位于第几项。最终应为两项直接输出后一项输入,输入后得出对应结果。且在正常习题中是无示例的,必须掌握对于习题的阅读理解,阅读理解将决定你的解题思路及开发方案。
    2. 注意小提示的内容等差数列,已知等差数列的前五项3, 6, 9, 12, 15,对于这个数列,我们可以观察到公差(每一项与前一项之差都相等。这个固定的差值称为公差)为6 - 3 = 9 - 6 = 12 - 9 = 15 - 12 = 3,因此,对于这个特定的等差数列,我们可以得出以下方程式(通项公式):第n项 = 第1项 + (项数 - 1) * 3,由此公式即可得出首项``公差``输入项对应结果
  • 参考答案

#include <iostream>
using namespace std;
int main(){
    // 定义首项,公差,输入数字
    int first = 3, difference = 3,number;
    cout << "首项为:" << first << endl;
	cout << "公差为: " << difference << endl;
	cout << "输入数字:" ;
	cin >> number;
	// 由规律 第n项 = 第1项 + (项数 - 1)  * 3 导出 number = first + (n - 1) * difference
	// 转化:
	// number = first + n * difference - difference
	// number - first + difference = n * difference
	// (number - first + difference) / difference = n
	// n = (number - first + difference) / difference
	// 求出 n 值,当输入值求得得 n 正整数时,说明符合,得出位于第几项,反之不符合
	const double n = static_cast<double>(number - first + difference) / difference;
	const bool b = (n > 0 && n == int(n));
    b?(cout << "是的," << number << "符合这个等差数列的规律,它是该等差数列的第" << n << "项"):
    (cout << number << "不符合这个等差数列的规律");
	return 0;
}

# 4.编写一个程序,输入一个正整数,然后判断该数是否为素数(质数)。

小提示:使用素数概念求解

素数定义

素数(又称为质数)是指大于 1 的自然数,除了 1 和它本身之外,不能被其他自然数整除的数。换句话说,素数只有两个正因数:1 和它本身。与之相对应的是合数,合数是至少有一个除了 1 和它本身以外的正因数的自然数。
例如,2、3、5、7、11、13 等都是素数,因为它们只能被 1 和自身整除。而 4、6、8、9 等是合数,因为它们有除了 1 和自身以外的其他正因数。

// 输入输出示例:
// 示例1
请输入一个正整数:17
17是素数。
// 示例2
请输入一个正整数:10
10不是素数。
// 示例3
请输入一个正整数:7
7是素数。
// 示例4
请输入一个正整数:1
1不是素数。
  • 你的答案
#include <stdio.h>
#include <iostream>
using namespace std;
int main()//输入一个正整数,判断它是不是素数,并输出结果。
{
	int num, i;
	printf("请输入一个正整数:");
	cin >> i;
	for (i = 2; i <= num - 1; i++)//从2开始循环判断,直到达到输出的数。
	{
		if (num % i == 0)
			break;
	}
	if (i < num)//比输入的数小则代表有其他数可以被整除
	{
		printf("%d不是素数",i);
	}
	else
	{
		printf("%d是素数",i);
	}
	return 0;
}
  • 解析 此题考查对题理解以及逻辑运算能力,通过题目得需判断输入的正整数是否符合大于 1 的自然数,除了 1 和它本身之外,不能被其他自然数整除的数的规则,分步判断:
    1. 大于1
    2. 除了1与自身,不能被其他数整除
      故此我们首先接受用户输入的正整数,然后使用循环检查该数是否为素数。如果输入的数小于等于 1,直接判定为非素数;否则,从 2 开始到该数的平方根(包括平方根),逐个检查是否有能整除的因子。如果找到能整除的因子,就判定为非素数。最终输出判断结果。

非常抱歉,此题超纲了,在后续学习for循环后将展开探索

  • 参考答案
#include <iostream>
using namespace std;
int main() {
    int num;
    // 输入正整数
    cout << "请输入一个正整数:";
    cin >> num;
    // 判断是否为素数
    bool isPrime = true;
    if (num <= 1) {
        isPrime = false;
    } else {
        for (int i = 2; i * i <= num; ++i) {
            if (num % i == 0) {
                isPrime = false;
                break;
            }
        }
    }
    // 输出结果
    if (isPrime) {
        cout << num << "是素数。\n";
    } else {
        cout << num << "不是素数。\n";
    }
    return 0;
}

# 5.某商店进行促销活动,打折规则如下:购买金额在 100 元及以上的部分打 9 折,购买金额在 200 元及以上的部分打 8 折,购买金额在 300 元及以上的部分打 7 折。请编写程序,输入购买金额,然后输出实际支付金额。

// 输入输出示例:
// 示例1:
请输入购买金额:80
实际支付金额为:80

// 示例2:
请输入购买金额:120
实际支付金额为:108

// 示例3:
请输入购买金额:220
实际支付金额为:176

// 示例4:
请输入购买金额:350
实际支付金额为:245

// 示例5:
请输入购买金额:100
实际支付金额为:90

// 示例6:
请输入购买金额:200
实际支付金额为:160

// 示例7:
请输入购买金额:300
实际支付金额为:210
  • 你的答案
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
	int a;
	printf ("请输入购买金额: ");
	cin >>a;
	if (a < 100)
	printf("实际支付金额为: %d",a);
	if (a >= 100)
	if (a >= 200)
	if (a >= 300)
	printf ("实际支付金额为: %d",a * 0.7);
	else
	printf ("实际支付金额为: %d",a * 0.8);
	else
	printf ("实际支付金额为: %d",a * 0.9);
	return 0;
}
  • 解析 此题主要考查条件运算符的使用,需要注意的是,条件运算符(又称三目运算符,三元运算符)是if条件语句的简写方式,如对if有掌握也可直接使用if条件语句计算。

  • 参考答案

#include <iostream>
using namespace std;
int main() {
    float purchaseAmount;
    // 输入购买金额
    cout << "请输入购买金额:";
    cin >> purchaseAmount;
    // 计算实际支付金额
    float discountedAmount = (purchaseAmount >= 300) ? purchaseAmount * 0.7 :
                            (purchaseAmount >= 200) ? purchaseAmount * 0.8 :
                            (purchaseAmount >= 100) ? purchaseAmount * 0.9 :
                            purchaseAmount;  // 不满足任何打折条件
    // 输出结果
    cout << "实际支付金额为:" << discountedAmount << endl;
    return 0;
}
上次更新: 2024-10-19 10:01:51