课后作业
chao_smile 2023/11/18
# 第五课
# 1.甲、乙、丙三人共有 24
元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。设甲、乙、丙三人的钱数分别为 a
、b
、c
。用逆推算法,从最后结果入手,按反相顺序,分步骤推算出每次各人当时的钱数:
小提示:
使用倒推法(代数逆序)从最后结果入手,按反向顺序,分步骤推算出每次分钱每个人的钱数
"所分给的数与各人已有数相同"的意思是:以第一次为例,甲给乙:给了乙已有数(当时自身所拥有全部的钱数),所以给过后乙的钱翻倍了
// 输出示例:
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)
// 输入输出示例:
// 示例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;
}
- 解析
- 当前程序报错
这个错误提示表明你的代码中存在一个错误。错误提示信息指出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;
}
解析
- 运行结果不符合
输出示例
,注意阅读题目,输出这个等差数列的公差和首项,输入一个数实现判断其是否符合此等差数列,如何符合的话继续输出其数字位于第几项。最终应为两项直接输出后一项输入,输入后得出对应结果。且在正常习题中是无示例的,必须掌握对于习题的阅读理解,阅读理解将决定你的解题思路及开发方案。 - 注意
小提示
的内容等差数列
,已知等差数列的前五项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
与自身,不能被其他数整除
故此我们首先接受用户输入的正整数,然后使用循环检查该数是否为素数。如果输入的数小于等于 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;
}