火龙信奥
  • 分享
  • 课程
  • 题库
  • CSES HARD
    • GESP
    • CSP
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • e课堂
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

第 10 课《一级综合程序设计》

作者: 作者的头像   huolong , 时间:2026-09-07 14:06:29 , 所有人可见, 阅读  2

第 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

关于火龙

  • 关于我们
  • 学员获奖
  • 预约试听
  • ACM课程
  • CSP课程
  • 学习指南

帮助中心

  • 用户协议
  • 打字练习 HOT
  • 在线画图
  • DevC++下载
  • CSP报名
  • GESP官网

推荐课程

  • C++零基础入门(可试看)
  • C++进阶提升
  • GESP考级辅导
  • GESP打卡
  • CSP-J/S打卡

公众号

火龙信奥公众号二维码

© 2017-2026 义乌市睿码科技有限公司版权所有 浙ICP备2021013995号

火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码