循环应用
2024-07-15 19:43:27
发布于:北京
语法阶段 I 的基本应用训练
一、最值问题
最值问题分很多种,基础阶段的最值问题常常指的是在一系列数中,找到最大,或找到最小。或再稍微难一些的找到第二最值,第三最值,第 K 最值等
但都是以找到第一最值为为基础。
找最值的基本思想是:局部贪最值。即每次探查一个新的数据时,都与已记录的最值进行比较,若新数据是新最值,则更新记录值。
如:记录的最大值是 7,准备探查 8,发现 8 > 7,则更新记录的最大值为 8。
题面问题通常会有两种方式
给出数据的范围
例如问题是:有 n 个整数 ,每个整数 ,输出其中的最大值。
可以设计一个记录最值的 maxx 并给初始值:(因为范围已知)
- 找最大,设最小,最好比最小更小
- 找最小,设最大,最好比最大更大
int n;
cin >> n; // 准备输入 n 个整数
int maxx = 0; // 比最小更小
for (int i = 1; i <= n; i ++) {
int a;
cin >> a; // 循环输入每一个 a 值,准备进行探查
if (a > maxx) {
maxx = a; // 若探查的 a 比记录的最大值还大,则更新记录的最大值 maxx
}
}
cout << "最大值为:" << maxx << endl;
不给出数据的范围
问题如上,但由于没给出数据范围,因此无法正确使用如上办法给出初始值。
可以考虑先输入第一个整数作为初始最值。
int n;
cin >> n; // 准备输入 n 个整数
int maxx;
cin >> maxx; // 输入第一个整数作为最值
for (int i = 2; i <= n; i ++) { // 已经输入了一个,还剩下 n - 1 个整数
int a;
cin >> a;
if (a > maxx) {
maxx = a;
}
}
cout << "最大值为:" << maxx << endl;
二、数位分离问题
该问题主要是来解决需要将一串整数进行拆分成每一位数码的问题。例如 123
拆成个位数 3
,十位数 2
,百位数 1
。
底层思想:带余数的整数除法 a ÷ b = c .... d
。
a/b = c 求商运算
a%b = d 求余运算
核心思想:十进制时,针对 b = 10 的整数拆分。
a/10 删除个位数
a%10 获得个位数
例如 a = 123
:a/10 = 12
, a%10=3
两种计算分别后的删除个位数后的整数,和其个位数。
如图示:
构建逻辑:当数字还不为 0 时,不断地进行拆分,直到拆成 0 为止。
/*设问:将输入的整数 n,从个位开始,拆出每一位进行输出,一个数码占一行*/
int n;
cin >> n;
while (n != 0) { // 当 n 还没被拆成 0 的时候,要一直拆
int t = n % 10; // 用 t 存个位数
n = n / 10; // 删除个位数后重新存回 n
cout << t << endl; // 输出
}
三、循环控制问题
循环控制是指使用 continue
和 break
改变循环执行的过程或结束。
continue
:结束本次循环 (结束循环体),继续下次循环
break
:退出一层循环 (结束本循环)
建议使用实验性代码来辅助理解。
实验性代码
// 输出 1 ~ 10
for (int i = 1; i <= 10; i ++) {
cout << i << ' ';
}
// 输出 1 ~ 5,在输出 5 之后,判断为真,执行了 break 退出循环
for (int i = 1; i <= 10; i ++) {
cout << i << ' ';
if (i == 5) break;
}
// 输出 1 ~ 4,在输出 5 之前,判断为真,执行了 break 退出循环
for (int i = 1; i <= 10; i ++) {
if (i == 5) break;
cout << i << ' ';
}
// 输出 1 ~ 4 和 6 ~ 10,在 i 为 5 的时候,判断为真,执行了 continue 结束本次循环,继续下次循环,即结束循环题,跳到 i++ 部分执行。
for (int i = 1; i <= 10; i ++) {
if (i == 5) continue;
cout << i << ' ';
}
// 找到第一个 x 的位置(位置:1~n)
int n;
cin >> n; // 共 n 个整数
int x;
cin >> x; // 准备找 x
for (int i = 1; i <= n; i ++) {
int t;
cin >> t;
if (t == x) {
cout << x << " 在" << i << " 位置" << endl;
break;
/* 已经找到了 x ,循环目的达成,可以停止
但需要注意的是,若这样处理,后面没输入完的整数,将不会再输入。 */
}
}
全部评论 6
太有实力了
2024-07-16 来自 北京
3非长牛逼,有实力
2024-07-16 来自 北京
2单扣一个“哇 (WA)”。
2024-07-16 来自 北京
2加油点赞啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
2024-07-16 来自 北京
1不是你们光在这里聊天,你们倒是进来的时候顺便点点赞啊,这样我们的论坛才能火,这样我们才能在ACGO首页上,这样才能有更多的新人同学来和我们一起来聊天
2024-07-16 来自 北京
1快点赞啊,让老师上榜一
2024-07-16 来自 北京
1
点赞点赞点赞点赞点赞点赞点赞点赞点赞点赞点赞点赞点赞点赞点赞点赞点赞点赞点赞!
2024-07-16 来自 北京
0
有帮助,赞一个