本章知识点
例1-1:你好洛谷
题目描述
输入下面的程序,编译运行。
题解
#include<iostream>
using namespace std;
int main(){
cout << "Hello LuoGu!";
return 0;
}
代码解读:
-
#include为头文件,用于引入库,iostream头文件是用来输入和输出的工具。
-
using namespace std,声明命名空间
-
int main()是主函数,
-
cout为C++总的输出语句
-
return 0表示主函数需要返回一个“0”,说明程序正常运行结束。
例1-2:解决算法问题的步骤
题目描述
有10个苹果,小A拿走了2个,Uim拿走了4个,八尾勇拿走了剩下的苹果,想知道:
1、小A 和 Uim两个人一共拿走了多少苹果?
2、八尾勇能拿走多少苹果?
题解
解题思路:小A和Uim共拿走了4+2=6个苹果,剩下的苹果就是八尾勇所拿走的,即10-6=4个苹果,直接输出答案即可。
代码如下:
#include<iostream>
using namespace std;
int main(){
cout << 2 + 4 << " " << 10 -2 -4;
return 0;
}
例1-3:分苹果
题目描述
分苹果。现在有14个苹果,要均分给4名同学,分不掉的苹果放回冰箱。请问:
1)每位同学能分得几个苹果?
2)一共分出去多少苹果?
3)把几个苹果放回冰箱?
题解
解题思路:题目提到了均分苹果,共有4名同学,因此每个同学可以分得14/4=3个苹果,共分出去14/4*4=12个苹果,剩下14%4=2个苹果放回了冰箱,直接将值输出即可。
代码如下:
#include<iostream>
using namespace std;
int main(){
cout << 14 / 4 << endl;
cout << 14 / 4 * 4 << endl;
cout << 14 % 4 << endl;
return 0;
}
例1-4:均分肥仔水
题目描述
均分肥仔水。现有500毫升的肥宅快乐水,要均分给3位同学,每位同学可以分到多少毫升?请输出一个数字作为答案
题解
解题思路:将500毫升均分到3人手上,因此为了避免浪费,需要将500转换为浮点数进行运算,因此每个人可以分到500.0/3=166.667毫升,输出即可。
代码实现:
#include<iostream>
using namespace std;
int main(){
cout << 500.0 / 3 << endl;
return 0;
}
例1-5:输出浮点数与精度误差
题目描述
输入以下程序,观察输出。
#include<iostream>
using namespace std;
int main(){
cout << 500.0 / 3 << endl;
cout << 5000000.0 / 3 << endl;
cout << 0.000005 / 3 << endl;
cout << 5e6 / 3 + 5e-6 / 3 - 5e6 / 3 << endl;
return 0;
}
题解
将上述程序编译,输出结果如下:
166.667
1.66667e+06
1.66667e-06
1.6666e-06
使用cout输出浮点数,默认保留不超过6位有效位,因此500.0/3输出166.667,如果输出数值太或太小会采用科学计数法进行表示,例如5000000/3正常输出应该为16666666.66,通过科学计数法表示为1.66667e+06,如果是正数,+可以省略,第四个输出1.6666e-06的原因是有效位的浮点数超过了限制,因此有效数字的最右端就会被舍去。
例1-6:火车问题
题目描述
火车问题。甲列车长260m,每秒前进12m;乙列车长220m,每秒前进20m,两车相向而行,从两车车头相遇开始计时,多长时间两车车位相离?已知答案是正数。
题解
解题思路:以甲车为参考系,甲车是静止的,乙相对甲车走了220+260=480m,相对速度为20+12=32m,所需时间为480/32=15s。
代码如下:
#include<iostream>
using namespace std;
int main(){
cout << (260 + 220) / (12 + 20) << endl;
return 0;
}
注:需根据题目实际情况考虑是否需要将时间转换为浮点数。
例1-7:对角线
题目描述
对角线问题。一个长方形的长和宽分别是6cm、9cm,求它的对角线长度。
题解
解题思路:根据勾股定理可知,对角线长度为:
6 2 + 9 2 = 10.8167 \sqrt{6^{2} + 9^{2}}=10.8167 62+92=10.8167
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
cout << sqrt(pow(6,2) + pow(9,2)) << endl;
return 0;
}
代码说明:
-
#include 是引入cmath头部,里面保存着很多数学相关公式函数。
-
sqrt是用于取平方根
-
pow是用于取平方
-
函数返回值是根据输入的参数类型决定的
例1-8:存钱
题目描述
存钱。Uim的银行账户里面有100元。经过了下面的操作:
1)往里面存了10元;
2)购物花掉了20元;
3)把里面的钱全部取出。
请在每次操作后输出账户余额,并使用换行符隔开。
解题思路
定义balance变量用于存放初始金额,变量类型为int型,依次执行后续操作,往里面存了十块钱,说明账户余额为初始金额+10,因此balance = balance + 10,购物花掉了20块,这时候账户余额在原先的基础上减去20元,这时候balance = balance - 20,将钱全部取出,这里balance = balance - balance了,即终值为0。
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int balance = 100;
balance = balance + 10;
cout << balance << endl;
balance = balance - 20;
cout << balance << endl;
balance = 0;
cout << balance << endl;
return 0;
}
也可以使用 += 或者 -=来简化计算流程:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int balance = 100;
balance += 10;
cout << balance << endl;
balance -= 20;
cout << balance << endl;
balance = 0;
cout << balance << endl;
return 0;
}
例1-9:计算圆与球
题目描述
当半径r=5时,请输出圆的周长、面积和球体积。取π=3.141593.
题解
根据公式,圆的周长C=2πr,圆面积S=πr²,球体积=4/3πr³,算出对应值即可。
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
double r = 5;
const double PI = 3.141593;
cout << 2 * PI * r << endl;
cout << PI * pow(r,2) << endl;
cout << 4.0 /3 * PI * pow(r,3) << endl;
return 0;
}
代码说明:
-
如果经常使用的数值,可以通过const关键字定义为常量,常量名通常用采用大写。
-
变量和常量命名规则如下
-
只能由英文字母、数字和下划线组成。
-
不能以数字开头
-
不能和其他关键字重复
-
变量名区分大小写,应采取见名知义的方式
-
例1-10:猴子吃桃
题目描述
猴子吃桃。一只小猴买了若干桃子。第一天它吃了这些桃子的一半之后,又贪嘴多吃了一个;第二天它也吃了剩余桃子的一半,又贪嘴多吃了一个;第三天它又吃了剩下的桃子的一半,并贪嘴多吃了一个。第四天起来一看,发现桃子只剩下一个。请问:小猴买了几个桃子?
题解
如果从第一天开始算一共购买了多少桃子不是很好算,由于我们已经知道了小猴吃桃子的过程以及最终所剩桃子的数量,不妨从后往前进行倒推即,第四天有一个桃子,第三天有(1+1) x 2=4个桃子,第二天有(4+1)x2=10个桃子,第一天有(10+1)x2=22个桃子。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
int num = 1; //第四天
num = (num + 1) * 2; //第三天
num = (num + 1) * 2; //第二天
num = (num + 1) * 2; //第一天
cout << num <<endl;
return 0;
}
上述代码也可以简化为如下代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
cout << (((1+1)*2+1)*2+1)*2 << endl;
return 0;
}
例1-11:评测机队列
题目描述
评测机队列。洛谷的评测任务是单位时间内均匀增加的。8台评测机30min可以刚好把评测队列中的程序评测完毕,10台评测机6min可以刚好把评测队列中的程序评测完毕。请问:几台评测机可以在10min时刚好把评测队列中程序评测完毕。
题解
第一种方法就是参考著名的牛吃草问题模型了,首先我们需要分析每分钟有多少的评测任务加入了队列,根据题意可以得知在(30-6)=24min内,增加了308-106=180份评测任务。因此我们可以得到每分钟增加了180/24=7.5份测评任务,接下来我们需要知道初始共有多少测评任务,我们就可以将60-6x7.5=15份,因此共有15+7.5x10=90份测评任务,要想在10分钟内测评完成,因此需要90/10=9台机器。
其实这道题有种非常简单的求解方法,因为8台评测机30分钟可以完成评测,10台评测机6分钟就可以完成评测,那么要想在10分钟内刚好完成评测机,那肯定就是9台了,因为不可以把评测机一分为二吧,因此就可以得出需要9台评测机。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n1 = 8, t1 = 30, n2 = 10, t2 = 6;
int t3 = 10;
double inc_rate = (1.0 * n1 * t1 - n2 * t2) / (t1 - t2); //增长速度
double init_nun = n2 * t2 - inc_rate * t2;
double ans = (init_nun + inc_rate * t3) / t3;
cout << ans << endl;
}
习题1-1
题目描述
请将下列公式翻译成表达式。
3 x + 5 y 3x +5y 3x+5y
c + 1 a b \frac{c+1}{ab} abc+1
3 a 2 \sqrt{3a^{2}} 3a2
( n + 2 ) ( n − 9 ) (n+2)(n-9) (n+2)(n−9)
题解
1、3 * x + 5 * y
2、(c + 1) / (a * b)
3、sqrt(3 * pow(a,2))
4、(n + 2) * (n - 9)
习题1-2
题目描述
下列变量名中,哪些是合法的,哪些是非法的?
(1)kkksc03
(2)OhILoveLuoguVeryMuchAndIWillStudy
(3)_lapple
(4)char
(5)kkk@SH
(6)a
(7)iPhone
(8)11dimensions
(9)__stdcall
题解
合法:
-
kkksc03
-
OhILoveLuoguVeryMuchAndIWillStudy
-
_lapple
-
a
-
iPhone
不合法
-
char (关键字)
-
kkk@SH(有特殊符号)
-
11dimensions(以数字开头)
-
__stdcall(函数)
例1-3
题目描述
安装配置好环境,将本章例题的所有代码输入到计算器中,亲自运行这些程序
题解
编译环境搭建可以直接安装CLion或使用VScode。
例1-4
题目描述
编写程序解决以下问题,然后手工计算,验证答案。
(1)3名同学 3h 可以扫干净3间教室,那么9名同学 9h可以扫干净几间教室?
(2)长方形的长和宽之和是 24cm,长比宽多 4cm。请问:长方形的面积是多少?
(3)小A和 Uim 在程序设计竞赛中的得分之和是 480,Uim 的得分是小A的1.4倍。请问:他们分别得了多少分?
(4)给同学分苹果,若每人分 3个就剩下 11个;如果每人分4个则少一个。请问:有多少位同学,有多少个苹果?
(5)小A 每分钟输入20 个字符,Uim 每分钟输入80个字符,Uim 比小A 先开始打字12min。请问:小A开始打字多少时间后能赶上 Uim 的进度?
(6)兔子有4只脚,,鸡有2只脚。一个笼子里面有若干只免子和鸡,有35个头,94 只脚。请问:兔子和鸡分别有几只?
(7)银行定期存款年利率是一年定存3.5%,五年定存4%。小A 和 Uim 手上各有10000元。小A决定每次存一年期,到期后将连本带利再存一年,直到存满5年。Uim 直接存五年定期。请问:5年后他们分别有多少钱?
题解
1、3名同学 3h 可以扫干净3间教室,那么9名同学 9h可以扫干净几间教室?
解题思路:假定每名同学每小时扫干净的教室数相同,设为x
。根据题意,3 * 3 * x = 3
,解得x = 1/3
。那么9名同学9小时可以扫干净9 * 9 * (1/3) = 27
间教室。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
int num_students = 9;
int num_hours = 9;
double classrooms_cleaned_per_student_hour = 3.0 / 3 / 3; // 每名同学每小时扫干净的教室数
int total_classrooms = num_students * num_hours * classrooms_cleaned_per_student_hour;
cout << "9名同学9小时可以扫干净 " << total_classrooms << " 间教室。" << endl;
return 0;
}
2、长方形的长和宽之和是 24cm,长比宽多 4cm。请问:长方形的面积是多少?
解题思路:设长方形的宽为w
,则长为w + 4
。根据题意可得方程w + w + 4 = 24
,解得w = 10
,则长为14
。面积A
为长乘以宽,即A = w * (w + 4)
。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
int perimeter_half = 24 / 2; // 长和宽之和的一半
int width = perimeter_half - 4; // 宽
int length = width + 4; // 长
int area = width * length; // 面积
cout << "长方形的面积是 " << area << " 平方厘米。" << endl;
return 0;
}
3、小A和 Uim 在程序设计竞赛中的得分之和是 480,Uim 的得分是小A的1.4倍。请问:他们分别得了多少分?
解题思路:设小A得分为a
,则Uim得分为1.4a
。根据题意可得方程a + 1.4a = 480
,解得a = 200
,Uim得分为280
。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
int total_score = 480;
double ratio = 1.4;
int score_a = total_score / (1 + ratio);
int score_uim = total_score - score_a;
cout << "小A得了 " << score_a << " 分,Uim得了 " << score_uim << " 分。" << endl;
return 0;
}
4、给同学分苹果,若每人分 3个就剩下 11个;如果每人分4个则少一个。请问:有多少位同学,有多少个苹果?
解题思路:设同学数量为n
,苹果数量为a
。可以建立两个方程:3n + 11 = a
和 4n - 1 = a
。可以通过解这两个方程得到n
和a
。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
int remaining_apples_when_3 = 11;
int missing_apples_when_4 = -1;
int students = (remaining_apples_when_3 - missing_apples_when_4) / (4 - 3);
int apples = 3 * students + remaining_apples_when_3;
cout << "有 " << students << " 位同学,有 " << apples << " 个苹果。" << endl;
return 0;
}
5、小A 每分钟输入20 个字符,Uim 每分钟输入80个字符,Uim 比小A 先开始打字12min。请问:小A开始打字多少时间后能赶上 Uim 的进度?
解题思路:小A的速度是每分钟20个字符,Uim的速度是每分钟80个字符。Uim比小A多打了12 * 80
个字符。小A要赶上Uim,就要打这么多字符。速度差是80 - 20
,则需要(12 * 80) / (80 - 20)
分钟。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
int speed_a = 20;
int speed_uim = 80;
int lead_time_uim = 12;
int catch_up_time = (lead_time_uim * speed_uim) / (speed_uim - speed_a);
cout << "小A开始打字 " << catch_up_time << " 分钟后能赶上 Uim 的进度。" << endl;
return 0;
}
6、兔子有4只脚,,鸡有2只脚。一个笼子里面有若干只免子和鸡,有35个头,94 只脚。请问:兔子和鸡分别有几只?
解题思路:设兔子数量为r
,鸡的数量为c
。兔子和鸡的总头数为r + c = 35
,总脚数为4r + 2c = 94
。可以通过解这两个方程得到r
和c
。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
int total_heads = 35;
int total_feet = 94;
int rabbits = (total_feet - 2 * total_heads) / 2;
int chickens = total_heads - rabbits;
cout << "兔子有 " << rabbits << " 只,鸡有 " << chickens << " 只。" << endl;
return 0;
}
7、银行定期存款年利率是一年定存3.5%,五年定存4%。小A 和 Uim 手上各有10000元。小A决定每次存一年期,到期后将连本带利再存一年,直到存满5年。Uim 直接存五年定期。请问:5年后他们分别有多少钱?
解题思路:小A每年存一次,用复利计算。Uim存五年,用单利计算。可以分别用复利和单利公式计算他们各自5年后的总金额。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
double principal = 10000.0;
double rate_a = 0.035;
double rate_uim = 0.04;
int years = 5;
// 复利计算
double amount_a = principal * pow(1 + rate_a, years);
// 单利计算
double amount_uim = principal * (1 + rate_uim * years);
cout << "5年后小A有 " << amount_a << " 元,Uim有 " << amount_uim << " 元。" << endl;
return 0;
}