CSP复赛冲刺03:J 组模拟题:把题意“逐字翻译”成代码
- 2026-09-27 12:12:57
NEO-GRID · 荧光网格 第 03 篇 S.01 · COVER J 组模拟题:把题意“逐字翻译”成代码 CSP-J/S 复赛冲刺 · 第 03 篇 06 步骤章节 02 真题示例 COVER · 封面 PAGE 01 一道题,究竟怎么从题面变成代码?—— J 组模拟题的核心,就是把题面“一字不差地翻译成代码”。 前两篇,我们把复赛的“流程”和“文件读写”铺好了。从今天起进入正题:一道题,究竟怎么从题面变成代码? J 组复赛的 T1、T2,有相当一部分是所谓的模拟题——题目已经把规则讲得明明白白,你不需要设计什么高深算法,只要把这段话一字不差地翻译成代码就行。 听起来是最简单的一类题,但每年都有大量选手在这里丢分。原因不是不会写,而是翻译的时候漏了一句、看错一行、算错一个类型。 今天用 2022 年 CSP-J 的两道真题——《乘方》和《解密》,把“逐字翻译”这件事讲透。
01 · 什么叫“逐字翻译”? STEP 01 / 06 好的模拟题,题面就是一份需求说明书: “如果 aᵇ 的值不超过 10⁹,就输出 aᵇ;否则输出 −1。” —— 题目原句 你要做的,就是把这句话拆成三部分——什么条件下(aᵇ ≤ 10⁹)、做什么(输出值 / 输出 −1)、边界在哪(“不超过”是 ≤)。 翻译题的胜负手,从来不在“思路”,而在三个地方: CHECKLIST · 要盯紧的三处 ■条件有没有漏(尤其是边界); ■类型对不对(会不会溢出); ■格式一致不一致(多余空格、多余提示语都算错)。 02 · 逐字翻译四步法 STEP 02 / 06 拿到一道模拟题,先别写代码,用笔在题面上圈四个东西: 圈完这四样,代码基本就成型了。下面看两道真题。
03 · 例 1《乘方 pow》:一道标准的翻译题 STEP 03 / 06 题目大意:给定正整数 a、b,求 aᵇ。若 aᵇ 超过 10⁹,输出 −1;否则输出 aᵇ。 照四步法圈一遍: ① 输入两个正整数 a, b; ② 算 a 的 b 次方; ③ 超过 10⁹ 输出 -1,否则输出结果; ④a, b ≤ 10⁹ —— 这一条最关键! 第 ④ 步直接改变了解法。b 可以到 10⁹,你要是老老实实乘 10⁹ 次,不但超时,int 也早溢出了。 正确的翻译是:边乘边看,一旦超过 10⁹ 就立刻收工。 CODE · cpp
这里藏着一个“翻译漏句”的经典陷阱——a == 1。 你想:a = 1 时,随便乘多少次答案都是 1,永远不超过 10⁹,所以永远不会 return;而 b 最大 10⁹,循环就会跑满 10 亿次——超时。 而 a ≥ 2 时,最多乘约 30 次(2³⁰ > 10⁹)就触发 return,循环瞬间结束。所以 a == 1 必须单独拎出来处理。 SAMPLE · 样例验证 输入 10 9 → 10⁹ = 1000000000,正好等于 10⁹(“不超过”含等于)→ 输出 1000000000; 输入 23333 66666 → 早就爆了 → 输出 -1。都吻合。
04 · 例 2《解密 decode》:把“数学关系”翻译成代码 STEP 04 / 06 第二题换了个样子——它给的不是操作步骤,而是一组数学关系: n = p × q,且 e × d = (p−1)(q−1) + 1。给定 n、d、e,求 p、q(保证 p ≤ q);无解输出 NO。 —— 题目原句 翻译这类题,分两步:先把关系式解出公式,再把公式写成代码。 第一步 · 解公式 把两个式子联立: ■ 由 n = p·q 得 p·q = n; ■ 把 e·d = (p−1)(q−1)+1 展开,可推得 p + q = n − e·d + 2。 记 m = n − e·d + 2,于是 p、q 就是方程 x² − m·x + n = 0 的两根。判别式 Δ = m² − 4n: □ Δ < 0 → 无解; ■ Δ 是完全平方数、且 (m − √Δ) 为偶数 → p、q 是整数,输出; □ 否则 → NO。 第二步 · 写代码 CODE · cpp
这道题里有三个“逐字翻译”的坑,一个比一个隐蔽: 输入顺序 题目描述的文字顺序是“n、e、d”,但真正决定读入顺序的是“输入格式”那一段——是 n、d、e。永远以“输入格式”为准,别被描述的顺序带偏。 数据类型 n 最大到 10¹⁸,int 早就装不下,必须 long long。好在 m ≤ 10⁹,m² 也在 long long 范围内,不会算错。 开方精度 sqrt 返回浮点数,对 10¹⁸ 量级可能差 1,所以要用 while 把 s 一点点修正回精确值——这是“用浮点函数处理大整数”的标准补救动作。 SAMPLE · 样例验证 输入 770 77 5 → m = 770 − 5×77 + 2 = 387,Δ = 387² − 4×770 = 383² → p = 2、q = 385,输出 2 385,与样例一致。
05 · “逐字翻译”最常翻车的三处 STEP 05 / 06 把它记成一张小卡,做题时对照:
🔑 一句话记住:模拟题不是“考你会不会写代码”,而是“考你读题够不够细”。 06 · 今天练什么 STEP 06 / 06 找两道 2022 CSP-J 的题上手: CHECKLIST · 今日练习 ■入门:把《乘方》敲一遍,重点体会 a == 1 的特判为什么会救命; □进阶:把《解密》的公式自己推一遍,再对照代码,看三个坑你能不能自己发现。 明天我们讲枚举与剪枝——当题目没有现成公式、只能“一个个试”的时候,怎么试得又对又快。 下期预告 · 第 04 篇 COMING 04 《J 组枚举与剪枝:暴力也能拿满分》——用 2021 CSP-J《分糖果》等真题,讲清楚暴力枚举怎么估复杂度、什么时候该剪枝。 CSP-J/S 复赛冲刺 PAGE 04
SUMMARY · 总结 END · 06 模拟题不是考你会不会写代码,而是考你读题够不够细。 翻译题的胜负手从来不在思路,而在条件、类型、格式三处——用四步法把输入、算法、分支、范围逐一圈清,翻译就基本不会漏。 ▣ AUTHOR · 作者 开心算法 信奥赛备考一站式账号,专注 GESP/CSP/NOIP 真题解析与学习路径规划。以四阶段闭环(语法→算法→结构→图论DP)为主线,每阶段对标真题检验,助你从零基础直通省一,不走弯路。 ▣ DATA BASE · 资料库 📚 更多信奥备考资料,尽在『开心算法』ima 知识库——GESP 真题、CSP/NOIP 历年真题、学习路径规划、编程数学通关课,扫码订阅,持续更新。
|






