
简介这是一份面向西北工业大学在线编程比赛NOJ参赛者的题目与解答汇编共收录116道赛题覆盖基础算法、数学问题、字符串处理、数据结构与算法优化等方向既适合赛前冲刺刷题也适合日常算法练习与查漏补缺。文档以单个doc文件形式提供容量约303KB内含题目描述与可直接复制的代码答案由于文档采用Word排版呈现复制代码时需稍作缩进和格式调整。内容亮点包括插入排序、链表创建与遍历、二分查找、大数加减乘除、成绩表计算与转换、出租车费建模、单词频次统计等经典题型并附有详细实现代码便于对照学习、逐题复盘和举一反三。目前已有231人浏览学习对于希望提升编程实战能力、强化算法与数据结构功底的读者而言这是一份实用的参考资料。1. 西工大 NOJ 116 题答案卡题时最该先看的东西西工大 NOJ 的作业题卡住过不少人尤其大一上学期刚接触 C 语言那阵子一道链表题磨一晚上是常事。这份「116 题及答案 Word 版」本质是把 NOJ 平台上高频出现的题目按题型整理成册每题附可参考的代码和思路。它不是拿来直接抄的而是卡题时的思路拐杖、期末前的复习提纲。适合正在刷 NOJ 作业、想核对思路、或者担心考试手生的人。纯粹零基础想靠它应付作业效果反而最差——后面的题会越来越依赖你亲手调代码的能力答案只能帮你把路走通走不顺的地方还是得自己踩。2. 读懂文档结构116 题的编排逻辑与适用课程拿到这份 Word 文档先别急着翻答案。我习惯先花十分钟把目录过一遍搞清楚这 116 题是按什么维度组织的再决定从哪道题下手。熟悉文档结构这件事价值不亚于答案本身——你知道哪里有货遇到问题时才能三秒定位。2.1 按题型划分的题目族从顺序结构到链表递归从题目关键词和西工大课程节奏推断这 116 题大概率是按知识点分篇排列的而不是按难度。常见编排逻辑是前 20 题左右覆盖顺序结构、分支和简单循环中间 40 题集中训练数组、字符串、函数后面 30 题进入指针、结构体最后 20 题左右是链表、递归和排序综合题。这种排法和大多数学校 C 语言程序设计课的进度表是对应的。对照课程大纲看覆盖范围这 116 题基本能铺满一学期 NOJ 作业的高频区间。期中前主要考语法正确性和分支循环逻辑期中后考数组下标管理和函数封装期末前考指针和链表。如果你正在刷作业按这个顺序从前往后做最顺如果你只剩一周要期末考直接从指针和链表部分开始补性价比更高。2.2 每题答案的常见写法代码风格、注释密度与编译器假设翻几道题的答案就能发现一个规律代码风格高度统一面向 C 语言课程设计。输入输出基本用scanf/printf很少有人用 C 的cin/cout头文件以stdio.h为主偶尔带string.h或stdlib.h注释不多变量名偏短比如a、cnt、tmp这类。这种风格在 NOJ 平台上跑得稳。原因有两个一是scanf/printf比cin/cout少了流同步的开销数据量大时不容易超时二是老版本 GCC 编译器对 C 语言支持更成熟短变量名不会引入命名空间冲突。你拿到的这份答案大概率是按「本地 Dev-C 能编译、NOJ 能过测评」的标准写的整体偏保守但稳定。2.3 对照课程进度这 116 题覆盖了你需要的哪些知识点我建议你做一件事把文档目录和你的教学大纲排个对照表。比如大纲第 3 周讲for循环你就重点练文档前 30 题大纲第 8 周讲指针你提前把指针族题目挑出来做。这样做的意义在于NOJ 的作业提交是有时间窗的你按课程节奏刷每次提交前能针对性参考答案而不是临时抱佛脚。3. 把答案用起来的三个步骤先查索引、再读思路、后独立重写很多人拿到答案文档直接复制粘贴这是最亏的用法。这份文档的正确打开方式我拆成三个步骤定位、读思路、合上重写。每一步都有具体操作方法照着做能真正把题目消化掉。3.1 用题干关键词反查题号NOJ 平台上的题号是数字编号题干里经常有独特名词比如「约瑟夫环」「回文数」「猴子吃桃」。在 Word 里按CtrlF搜索这个关键词能快速定位到对应题目的答案页。具体做法先把平台上的题干复制下来抽出 2 到 3 个有辨识度的词不要用「输入一个整数」这种通用短语去搜「蛇形填数」「大数加法」「链表逆置」这类实体名词定位准确率会高很多。定位到之后看一眼答案开头的解题思路描述。这份文档里不少题目前面有一段简短思路比代码本身更值钱。思路部分通常两三行但点出了关键数据结构或算法方向。比如「用两个指针一前一后遍历」「先排序再双指针求和」「递归终止条件是链表为空」。读懂了这段话再看代码就不会迷茫。3.2 把代码逻辑简化为三步伪代码我一般会做一件事把答案代码的逻辑压缩成三步伪代码写在题目旁边。比如有一道题是「统计一行字符串中单词个数」答案代码看着二十多行但核心逻辑就三步跳过连续空格、遇到非空格字符计数加一、循环到字符串结束。压缩成伪代码后你记住的是骨架而不是血泪。这里要留意一个边界答案可能用了多个变量做辅助比如flag标记是否处于单词中。伪代码可以写成「遇到首个非空格且flag0就计数并置flag1遇到空格就置flag0」。把逻辑压缩到这个程度合上文档自己写就有抓手了。3.3 合上文档独立重写再逐行对照差异关键动作是「合上文档」。打开编译器新建一个.c文件自己从头写。写不出来的地方记下来回到文档看两分钟再合上继续写。写完后把两份代码并列放在屏幕上逐行对照。对照时重点查三件事循环边界是否一致、数组下标是否越界、指针是否判空。我见过最多的差异是这样的答案里循环条件是i n自己写成了i n结果多跑一次循环数组越界但不报错输出多一行垃圾值。这类问题你自己查不出来但和答案一对比马上就能发现。对照不是为了「抄对」是为了找出自己逻辑里那根断掉的弦。4. 从复制到内化改代码适配自己的环境与输入约束116 题答案里的代码不是万能模板。在不同编译器版本、不同题目输入约束下直接照搬有时会翻车。这一章讲清楚三个需要改代码的地方编译器差异、数组大小、输出格式。4.1 编译环境差异C 标准、头文件与警告级别NOJ 测评机用的编译器和你自己电脑上的不一定一样。常见做法是 NOJ 用 GCC 按 C99 或 C11 标准编译Dev-C 默认可能走 C98。如果你本地的代码用了 C99 以后的语法特性比如for(int i0; in; i)这种循环内声明变量在旧标准下会报错。答案里如果出现#include stdbool.h或bool类型注意这是 C99 才有的。遇到这类情况我的习惯是把代码改成纯 C89 风格更稳妥变量全在函数开头声明头文件只保留stdio.h。改法很简单把循环内的int i提到函数开头即可。提交前在 NOJ 的在线编辑框里粘贴一次代码看看有没有语法高亮报警很多编译器报错能提前发现。4.2 数组大小与数据范围按题目约束调整不要照抄这是翻车最频繁的地方。文档里某道题的代码开了一个a[100]的数组但你提交时题目输入范围可能已经调整过比如n的上限从 100 变成了 1000。数组没开够测评数据一大就直接越界表现形式不是编译错误而是运行时错误或者答案错误很难排查。我一般会养成一个习惯拿到任何数组题先把题目里的数据范围抄在一张便利贴上再去看答案。答案里数组开多大和题目约束对比一下不够就改。示范如下假设原来答案是这样写的#include stdio.h int main() { int n, i; int a[100]; // 原答案假设 n 100 scanf(%d, n); for (i 0; i n; i) { scanf(%d, a[i]); } // 后续处理省略 return 0; }逻辑本身没问题但如果你从 NOJ 平台看到n 1000数组必须相应扩大#include stdio.h int main() { int n, i; int a[1005]; // 多开 5 个防止下标越界 scanf(%d, n); for (i 0; i n; i) { scanf(%d, a[i]); } // 后续处理省略 return 0; }数组多开 5 到 10 个空间是我的习惯。原因很简单有些循环里会用a[i1]或a[i-1]边界判断稍微松懈一点就容易踩到未定义区域。多开几个位置相当于给缓冲留了余量不改变逻辑但能挡住很多隐蔽的运行时错误。4.3 输出格式空格、换行与多余输出是隐性杀手答案里的输出格式是照着测评系统的预期写的多一个空格、少一个换行都可能被判错。常见情况是题目要求每行输出一个整数行尾不能有空格但答案代码里可能在每个数字后跟了空格这在某些测评机上不报错但不给分。排查方法很直接把你程序的输出重定向到一个文本文件再用十六进制查看器看末尾。正常情况是最后一个字符是换行符0A如果末尾有一个空格20基本就中招了。另一个高频坑是「答案错误但不是全错」只有边界数据出错往往是输出里多了调试用的printf。提交前检查一下你的代码里有没有printf(debug)这种残留我在帮学弟改代码时至少见过五次这种操作。5. 避坑指南NOJ 提交与答案复现的常见问题这一章是重头戏。我把实际使用这份文档过程中最容易踩的五个坑写清楚每条按「现象 → 原因 → 解决」展开。看完这五条你至少能少浪费一个晚上的调试时间。5.1 复制粘贴后编译报错全角字符与隐藏格式现象从 Word 里复制答案代码到 Dev-C 或 NOJ 编辑框编译报错错误位置指向一个不可能出错的行。原因Word 会自动把英文引号、分号、括号替换成全角字符比如变成“;变成。复制到编译器后编译器不认识这些全角符号报错信息指向的行号和你看到的内容对不上。解决粘贴代码后先全选把字体统一改成纯文本再逐行扫一眼字符串和分号附近有没有全角字符。更稳妥的办法是把代码先粘贴到记事本再从记事本复制到编译器。记事本会自动剥掉 Word 的格式全角字符会原样保留这样你至少能肉眼发现异常。我个人的习惯是永远不直接从 Word 复制代码中间过一道纯文本编辑器。5.2 答案和题目对不上号题号漂移与题干改动现象文档里写着「第 57 题」但 NOJ 平台上的第 57 题是另一道题完全不是文档里描述的解法。原因NOJ 平台历年题目有增删和排序调整旧的题号会被新题顶掉文档整理时的题号与当前平台不一致。另一个可能原因是同一道题有多种表述版本平台换了个题干描述但解法相同。解决不要靠题号找答案靠题干关键词找。把当前 NOJ 题目界面上的核心词复制进 Word 做全文搜索比对代码是否吻合。如果搜不到试试搜输入输出样例中的某个特殊数字比如样例输出是124直接搜124比搜题号靠谱得多。5.3 能编译过但提交判错输入边界与输出格式差异现象本地运行测试数据完全正常一提交到 NOJ 就是 Wrong Answer或者只有一个测试点过其他全错。原因本地测试数据往往只有一个样例而测评系统有十几组数据覆盖边界情况。常见边界包括n0或n1的最小输入、字符串含空格、输入末尾多一个换行符。你的代码在普通数据下没问题在边界数据下行为不对。解决看完答案后自己构造至少三组边界测试数据。比如题目说「输入正整数 n」你就分别试n1和n最大值如果题目说「输入一个字符串」一定要试带空格的字符串。把边界数据跑一遍再提交能过滤掉八成以上的 Wrong Answer。5.4 本地跑通但线上超时算法复杂度的差距现象本地一秒钟出结果提交 NOJ 显示 Time Limit Exceeded超时。原因本地测试只有一组数据感受不到复杂度压力。NOJ 的测评数据是批量生成的如果代码用了两层嵌套循环数据规模一上万运行时间就爆了。答案文档里有些题给出了高效解法有些题用的可能是最朴素的枚举法——这在课程作业阶段能过但在测评数据变大后就难说。解决看答案时顺手数一下循环嵌套层数。两层以上且循环变量都接近题目上限的要考虑是否有更优解。比如查找类题目答案是两层循环枚举行和列但如果你发现题目数据范围是10^5级别就该想到排序后二分查找或哈希表。文档里的参考答案不一定是最优解你完全可以在这个基础上优化提交。5.5 抄答案的副作用考试周手生现象平时 NOJ 作业全对期末上机考试或笔试遇到类似题目写不出来。原因每次都是复制答案提交没经过独立编码训练。NOJ 平时分好看但动手能力没有积累。考试题目和作业题长得很像但细节变了你只记得答案「长什么样」不记得「为什么这么写」换个输入格式就不会了。解决规定自己每道题至少要独立写到「卡住」再去看答案。卡住的意思是连续 20 分钟写不下一行有效代码。看完答案后再合上写一遍。这个习惯坚持到第 30 题左右你会发现很多题目套路互通后面的题自然不需要答案了。6. 进阶用法从 116 题里提炼五类常用算法模板当你能独立做出前一半题目时这份文档的价值就从「答案」变成了「模板库」。我建议你从 116 题里挑出五类高频模板数组遍历与累加、字符串处理、链表操作、递归与分治、简单排序与查找。每一类抽出两到三道的共同骨架记在一个单独的笔记文件里。以链表逆置为例从两三道答案里能提炼出同一种写法用三个指针pre、cur、next完成原地逆置核心代码就五六行但边界检查非常重要。cur为空的判断必须放在访问cur-next之前否则空指针异常直接崩溃。这个模板一旦记下来所有链表逆置类题目都能套用。再比如递归题几乎所有题目的骨架都是「先写终止条件再写递归调用」。终止条件通常是链表为空、字符串到结尾、或者 n 减到 0写递归前先把这三行框架搭好效率比边写边想高很多。我自己的习惯是每看完一份答案就在模板笔记里补一条「这题用的什么数据结构、什么算法思想」。116 题全部过完之后你的笔记就是一份比原文档更值钱的浓缩版题解。考试前一天看这份笔记比翻 Word 文档快得多。提醒一下模板不要直接背代码背「先做什么、再做什么、边界在哪」就够了具体语法现场拼。从那以后我每拿到一份题目答案都强制自己先压缩成三行伪代码再动手。这个习惯帮我避开了无数次复制粘贴翻车的尴尬也希望帮到你。本文还有配套的精品资源点击获取