for循环嵌套例题专题
一、语法
当"重复里面还有重复"时,就要用循环嵌套。
基本结构:
cpp
for (int i = 0; i < 行数; i++) {
for (int j = 0; j < 列数; j++) {
// 每个位置要做的事
}
cout << endl; // 一行结束后换行
}
理解方式:
- 外层
i:控制行数,第几行; - 内层
j:控制列数,输出当前这一行里面都有些什么。
二、例题详解
例题1:数字直角三角形
- 题目链接:P5721 数字直角三角形
题目描述
给出 n,输出一个直角边长度为 n 的数字直角三角形。
所有数字都要按 2 位输出,不足 2 位前导补 0。
输入格式
一个正整数 n。
输出格式
按题意输出图形。
输入输出样例
输入:
text
5
输出:
text
0102030405
06070809
101112
1314
15
思路讲解
- 首先我们分析一共有多少行,外层循环控制行数,共
n行,所以我们需要一个变量来控制行数,这里我们使用变量i。 - 然后我们分析每一行要输出多少个数字,第
i行要输出n-i个数字,所以内层循环写成j < n - i。 - 最后我们使用变量
idx来维护当前数字,保证每输出一次就加 1。
参考代码
cpp
#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
cin >> n;
int idx = 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i; j++) {
if (idx < 10) {
cout << '0' << idx;
} else {
cout << idx;
}
idx++;
}
cout << endl;
}
return 0;
}
例题2:最长连号
- 题目链接:P1420 最长连号
题目描述
给定长度为 n 的整数序列,求其中最长的"连续递增 1"子段长度。
例如连续段满足后一个数等于前一个数加 1。
输入格式
第一行输入一个整数 n。
第二行输入 n 个整数,表示序列。
输出格式
输出一个整数,表示最长连号的长度。
输入输出样例
输入:
text
10
1 5 6 2 3 4 5 6 8 9
输出:
text
5
思路讲解
cur记录"当前连续段长度",ans记录"历史最大长度";- 每次读入新数字
x,判断是否满足x == 上一个数 + 1; - 满足则
cur++,否则重置cur=1; - 每轮都更新一次
ans。
参考代码
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int ans = 1;
int cur = 1;
int x, x2;
cin >> x2;
for (int i = 1; i < n; i++) {
cin >> x;
if (x == x2 + 1) {
cur++;
if (cur > ans) {
ans = cur;
}
} else {
cur = 1;
}
x2 = x;
}
cout << ans << endl;
return 0;
}