第 10 课:一级综合程序设计
本课学习目标: 1. 掌握编写完整 C++ 程序的三步法核心思路:输入数据 ➡️ 处理数据 ➡️ 输出结果。 2. 熟练运用“循环 + 分支”解决条件统计与条件累加问题。 3. 熟练掌握“循环数位处理”模型(求数位和、统计奇偶数位、数字反转)。 4. 掌握枚举因数、朴素判断质数(素数)的常见代码模板。 5. 掌握“连续输入直到特殊结束标志(如
-999)”求最大最小值的经典写法。
一、 完整程序的基本思路:“输入、处理、输出”
在一级考试的编程大题中,题目不会让你写很复杂的算法,而是要求根据明确的规则写出一个小功能。所有的完整程序,都可以拆解为标准的三个步骤:
#include <iostream>
using namespace std;
int main() {
// 第1步:输入数据(定义变量并用 cin 或 scanf 读入)
// 第2步:处理数据(利用 分支 if 或 循环 for/while 进行计算与判断)
// 第3步:输出结果(用 cout 或 printf 打印答案)
return 0;
}
二、 核心综合模型一:奇偶统计(循环 + 分支)
- 题型描述:输入一个正整数 $n$,接下来输入 $n$ 个整数,统计其中奇数的个数和偶数的个数。
- 核心代码实现: ```cpp int n; cin >> n; int odd = 0, even = 0; // 初始化奇数计数器、偶数计数器
for (int i = 1; i <= n; i++) { int x; cin >> x; // 逐个读入每个数 if (x % 2 != 0) // 判断是否为奇数 odd++; else even++; } cout << odd << " " << even; ```
三、 核心综合模型二:数字反转(数位处理高频题)
- 题型描述:输入一个正整数 $n$(例如
1234),输出它反转后的数字(4321)。如果反转后高位出现了0(如120变成021),前导0自动忽略(变成21)。 - 核心代码实现: ```cpp int n; cin >> n; int rst = 0; // 存放反转后的结果,初始化为 0
while (n != 0) {
rst = rst * 10 + n % 10; // 核心公式:原结果乘10加上当前个位
n /= 10; // 去掉个位
}
cout << rst;
``
* **原理解析**:每一次循环,先把旧的翻转结果扩大 10 倍(腾出个位),然后把当前n` 的个位数拼接到末尾。
四、 核心综合模型三:枚举因数与朴素质数判断
1. 输出一个正整数的所有因数
- 原理解析:枚举从 $1$ 到 $n$ 的所有整数
i,如果n % i == 0,说明i就是n的因数。cpp int n; cin >> n; for (int i = 1; i <= n; i++) { if (n % i == 0) { cout << i << " "; } }
2. 朴素判断质数(素数)
- 质数定义:只能被 $1$ 和它本身整除的正整数(注意:1 不是质数)。
- 核心思路:统计 $1$ 到 $n$ 之间有多少个数能整除 $n$(即统计因数个数)。如果因数个数恰好等于 2,它就是质数。
cpp int n; cin >> n; int cnt = 0; // 统计因数个数 for (int i = 1; i <= n; i++) { if (n % i == 0) { cnt++; } } if (cnt == 2) { cout << "Y"; // 是质数 } else { cout << "N"; // 不是质数 }
五、 核心综合模型四:连续输入直到结束标志(求最值)
- 题型描述:连续输入若干个整数,输入
-999表示结束(-999只是个信号,不参与最值计算)。求输入的所有有效整数中的最大值和最小值。 - 核心代码实现: ```cpp int x; cin >> x; // 先读入第一个数 int mx = x, mn = x; // 用第一个有效数初始化最大、最小值
while (x != -999) { if (x > mx) mx = x; // 更新最大值 if (x < mn) mn = x; // 更新最小值 cin >> x; // 继续读入下一个数 } cout << mx << " " << mn; ```
六、 GESP 一级真题与例题精讲
练一练 1:数位和计算
【题目】
输入一个正整数 n(例如 5026),输出它的各个数位之和。
参考代码:
cpp int n; cin >> n; int sum = 0; while (n != 0) { sum += n % 10; // 取个位累加 n /= 10; // 去掉个位 } cout << sum;输入5026的输出结果:5 + 0 + 2 + 6 = 13。
练一练 2:数字反转前导零处理
【题目】
下面程序输入 120 后,输出是( )。
int n;
cin >> n;
int rst = 0;
while (n != 0) {
rst = rst * 10 + n % 10;
n /= 10;
}
cout << rst;
A. 120
B. 021
C. 21
D. 程序报错
正确答案:C 名师解析: 按照反转逻辑执行: 1. 取出个位
0,rst = 0 * 10 + 0 = 0,n变成12。 2. 取出个位2,rst = 0 * 10 + 2 = 2,n变成1。 3. 取出个位1,rst = 2 * 10 + 1 = 21,n变成0。 最终输出rst的值为21(数学上的整数21自动抹掉了最高位无意义的0)。
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com