西工大NOJ 116题C语言刷题全攻略:从语法基础到AC实战
简介面向西工大NOJ在线编程竞赛学习者这份题目与答案合集整理了116道赛题及完整代码覆盖基础算法、模拟、数学建模、字符串处理、链表操作、排序与查找、大数加减乘除、二分与迭代求根等方向适合备赛学生、上机练习者以及想提升算法与数据结构能力的程序员。资源包体积仅303KB内含1个doc格式的Word文档答案可直接复制引用由于Word版本可能存在缩进或空行异常复制后需稍作排版。文档按目录列出题号与页码收录边沿与内芯的差、不屈的小蜗、操场训练、插入链表节点、插入排序、成绩表计算、出租车费、创建与遍历职工链表、大数运算、单词频次等典型题目每题配有代码与解题思路便于按知识点选做或对照复盘。目前已有224人学习下载既能用于NOJ备赛刷题也可作为数据结构与算法课程、实验课的辅助材料。1. 116这套题到底什么来头先说个挺真实的场景在西工大大一上学期C语言课程还没结束很多宿舍晚上聊天的内容就已经从游戏变成了你今天AC了几道NOJ做到哪了。等到考试周前几乎人手一份116题及答案word版这种资料打印店老板甚至能直接背出文件名。NOJNorthwestern Polytechnical University Online Judge是西工大计算机类课程的核心OJ平台C语言程序设计这门课的实验、平时作业、部分上机考试都直接以这套题的通过情况作为重要参考。116这个数字不是随便凑的它基本覆盖了一门C语言课程从语法入门到复杂程序设计的全部知识点从最简单的Hello World级别热身题到结构体、链表、文件读写这类期末压轴题都有涉及。对刚接触编程的大一新生来说这套题就是一座标尺刷完前30道说明你基本语法过关刷完前80道函数和数组这些硬骨头算是啃下来了要能独立把116道全部跑通那这门课拿高分基本稳了。但要注意网上流传的116题及答案word版这类文件本质上不是让你抄的而是一种学习资源的整理方式。我的建议是把它当作题单、当作参考答案、当作错题记录模板来用而不是当作背诵材料。这一点在后面我会展开说。提醒不同年级、不同老师开设的C语言课程NOJ题号对应的具体题目可能每年都会有微调。你手里这份116题Word版如果和当前OJ页面上的题号对不上不要慌知识点分布基本是一样的按题目的考查点去索引就行。2. 116题的隐藏架构你其实在学一门代码工程入门课很多人刷NOJ有一个误区只看单道题的输入输出不回头看整个题单的结构。其实你把这116道题的顺序捋一遍会发现它的编排是很有讲究的几乎就是在对应C语言教材的章节推进。2.1 从题号看知识点的分层推进我以比较常见的NOJ题库版本为例大致可以分成这么几个阶段前10题左右顺序结构程序设计。核心就是printf和scanf让你搞清楚程序是顺序执行的这个概念以及OJ最基础的输入输出格式要求。第10到30题分支结构。if-else、switch加上一些简单的逻辑判断比如判断闰年、排序三个数、分段函数求值。第30到55题循环结构。for、while、do-while经典的累加累乘、求最大公约数、水仙花数、素数判断这类题开始大量出现。第55到80题数组和字符串。一维数组、二维数组、字符数组涉及排序算法冒泡、选择、查找、字符串处理函数。第80到100题函数、递归、指针。这是C语言第一个真正的分水岭很多同学就是在这里开始掉队的。第100题往后结构体、链表、文件操作。这部分题目量不多但综合性强往往是一道大题的规模期末上机考试的最后一道题基本就出在这里。2.2 为什么这个顺序不能乱跳我见过不少同学刚会写printf(Hello World)就想去挑战链表反转结果被指针指得怀疑人生回头连循环都不想写了。这套题的设计逻辑其实是螺旋上升的前面的题看似简单但每一步都在为后面的题埋点。比如前30题里的格式输出题很多同学觉得不就是打印几个星号吗有什么好练的结果到了后面的字符串处理题才发现自己对空格、换行、回车符的理解全是模糊的。再比如循环结构里的累加题到函数章节会变成用递归实现求和数组章节的排序题到指针章节会让你用指针完成函数间数组传参。你会发现同一个知识点会在不同阶段被反复提起但要求越来越高。所以我的建议是按顺序刷不要跳题。哪怕你觉得某道题太简单也要亲手把它AC掉因为AC本身是一种状态确认——确认你对当前知识点的掌握没有盲区可以放心进入下一层。这和打游戏推图是一个道理前面的关卡掉的血少不代表后面的Boss也能轻松过。3. 典型题目拆解从读题到AC的全流程思路很多人刷题卡住不是不会写代码而是不知道怎么分析题目。我拿几个NOJ里出现频率极高的题型来拆一拆把这个套路说清楚。3.1 循环类题目求数列前N项和题目大概会是这样输入一个正整数n计算1 1/2 1/3 ... 1/n的值输出保留两位小数。拿到这种题第一步不是写代码而是确认数据类型。1/n在C语言里如果n是int1/n就是整数除法结果直接归零。所以你必须写成1.0 / n或者把变量声明成double。这就是NOJ最喜欢埋的坑之一不是不会做是对除法运算的隐式类型转换不敏感。第二步是设计循环#include stdio.h int main() { int n, i; double sum 0.0; scanf(%d, n); for (i 1; i n; i) { sum 1.0 / i; } printf(%.2f\n, sum); return 0; }第三步是边界测试。很多人只测一个正常输入比如n5发现能跑就提交结果WAWrong Answer了。正确的做法是至少测试n1n10000这种极端值。n1时循环只执行一次没什么问题但如果n很大你要想一下int能不能存下n本身以及累加结果的精度是否够用。这类题往往还会引申到输入多组数据输出对应结果这时就要用到while(scanf(%d, n) ! EOF)这种写法了。3.2 数组与排序为什么这道题你总是超时NOJ里有一道很经典的排序题要求对n个整数从小到大排序并输出。很多同学的第一个版本是冒泡排序二重循环O(n^2)复杂度。如果n只有100怎么玩都行但如果n到了10000冒泡就很悬了。这个阶段你还没学快速排序但它考察的真实意图是你有没有理解题目给的数据范围意味着什么。阅读题目时第一件事是看数据范围第二件事是根据范围选择算法。10000个元素的O(n^2)排序在OJ服务器上很可能超时Time Limit Exceeded评测系统给你1秒你就要想办法把复杂度压下来。这时候你有两种选择一是手写一个归并排序或快速排序用递归实现正好对应后面的知识点二是观察题目数据是否有特殊规律比如数值范围很小可以用桶排序的思路开一个大数组读一个数就往对应下标的位置做标记最后遍历一遍输出。后者虽然有点投机取巧但在NOJ里完全可行而且能AC。3.3 字符串处理隐藏的换行符大坑字符串题目是WA的重灾区。举个典型例子输入一行字符串要求逆序输出。看起来很简单但如果你用gets读、然后计算strlen倒着输出十有八九会在第一遍提交时踩坑——因为NOJ的评测数据可能包含空格而scanf(%s)读到空格就停了。正确处理思路是用gets或fgets读入整行注意fgets会把末尾的换行符\n也读进来所以输出前要处理掉这个换行符。这也是为什么我用陷阱密布来形容字符串题你不仅要会写正常的代码还得知道各种输入函数的行为差异。很多同学在这些题上反复WA之后养成了一个特别好的习惯——每次提交前先自己在本地构造几个刁钻的测试用例。这个习惯比AC这道题本身值钱得多到后面的数据结构、算法课上你会感谢自己的。4. 结构体与文件操作压轴题NOJ为什么一定要考这个NOJ题单最后十来道题通常是类似学生信息管理系统的综合性题目。要求你用结构体存储学生的学号、姓名、成绩支持录入、排序、查询、保存到文件、从文件读取等功能。很多同学在这里第一次有了原来代码还能干这种事的感觉也有一部分同学在这里彻底放弃了。4.1 这类题目考查的其实是数据组织思维前100道题里你处理的基本是单个的int、float、char数组数据之间的关系是线性的。但真实世界的程序数据之间是有结构的一个学生有多个属性一个班级有多个学生一个学校有多个班级。结构体的意义在于把一组相关的数据打包成一个整体让代码的语义更接近现实。做这类题的时候推荐先写一个结构体定义然后围绕它设计函数typedef struct { char id[20]; char name[50]; double score; } Student; void inputStudents(Student stu[], int n); void sortByScore(Student stu[], int n); double getAverage(Student stu[], int n);你会发现C语言的函数结构体组合已经能实现一个迷你版的学生成绩管理系统了。这种从写算法题到写系统功能的转变是116题最后一程最重要的价值它让你第一次以程序员的视角去看待数据的组织方式。4.2 文件读写需要注意的几个细节fopen的打开模式是r读还是w写别搞混很多同学写了半天发现自己一直在往空文件里写数据就是因为一个字母的差别。用fprintf和fscanf读写文本文件时格式控制符要和结构体成员的变量类型严格一致否则读出来全是乱码。文件操作完毕后要fclose关闭文件否则数据可能没有真正落盘。这属于IO资源管理的基本素养虽然NOJ评测可能不检查但后续做真实项目时文件句柄泄漏会造成很烦人的bug。5. 这份Word版资料怎么用才能价值最大化你手上这份116题及答案word版如果拿来做对答案用的那浪费了一大半价值。我的用法建议是这样的。5.1 把答案文件改造成只读参考手册先自己独立写每一道题写不出来可以看答案但看答案之后一定要做两件事第一把这题的思路用自己的话写在代码旁边第二合上答案从零开始再写一遍。这样一遍下来这道题才是真变成你的了。如果只是看懂了其实很难过。我在带同学的过程中发现一个规律凡是能把看过的题第二天重新独立AC一遍的人后面的进度会明显超过只看不练的人。5.2 建立自己的刷题进度表Word版里通常只有顺序排列的题目和答案我建议你额外建一个Excel或表格列这么几列题号、知识点、是否AC、首次尝试次数、卡壳原因。记录卡壳原因特别有用——你会发现自己的错误往往集中在某几个类型比如忘记初始化变量循环边界写错输入方式不对。把这些弱点找出来比盲目多刷50道题有效得多。5.3 一题多解是进阶的分水岭116题能全部AC说明你及格了但如果你每一题都只写出一种解法那你可能错过了很多提升的机会。比如求最大公约数你可以用辗转相除法也可以用递归甚至可以用更相减损术。每道题都试着一题多解相当于用一道题的时间练了三道题的内容。这在期末上机考试时特别占便宜遇到原题或变体题你的思维切换速度会快很多。实操经验我当年刷题时对每道题会记录一个最优解和一个最暴力解。最优解是满足题目要求且代码最简洁的版本最暴力解是思路最简单、容易理解的版本。考试时先用最暴力解拿到基础分有时间再优化这个节奏非常重要。6. 刷题过程中的心态管理和常见崩溃点聊完具体技术说说更关键的东西心态。6.1 大面积WA出现时先深呼吸再动手NOJ跟课设不同它不显示你的错误具体在哪里只给你一个WA或者Runtime Error。很多同学第一次遇到WA会手足无措陷入改一行提交一次再看结果的死循环。正确做法是先把代码从头到尾读一遍确认逻辑没有明显问题然后构造两三个边界测试用例在本地跑一遍如果还找不出问题再考虑是不是输入输出的格式问题。有一个很常见但容易被忽略的问题输出格式中多了一个空格或者少了一个换行。比如题目要求每行输出一个数你输出的是每行输出一个数加一个空格OJ在字符级比较时会直接判WA。这种错误看代码很难发现最好的办法就是对照题目原样检查。6.2 卡在某道题超过两天果断换策略我以前有个同学卡在第68题一个递归题整整一周每天从晚上7点坐到11点最后差点对编程产生心理阴影。后来我把题目拿过来一看发现她不是递归不会而是前置的指针数组传参没搞清楚属于知识断层。这种情况闷头死磕效率极低。如果你在一道题上卡了超过两天我建议先放下这道题去看它对应的知识点的教材章节或者翻答案看思路然后第二天回头再写。千万不要觉得看答案就是可耻的学习资源的合理利用本身就是能力的一部分。真正常见的不是看答案的人而是看了答案也不动手敲的人。6.3 期末备考时的优先级怎么排如果期末上机考试临近而你还没刷完116道不用慌。优先级应该是循环、数组、字符串、函数这些基础题型占大头一定要优先保证AC率结构体和文件题就算没有完全吃透也要确保自己能写出最基础的学生信息录入和输出。这样就算遇到压轴大题拿个基础分并不难。反而是那些难题不会做但基础题粗心写错的人最后分数往往更难看。7. 116题AC之后你的下一步在哪把116题全部刷完说实话你已经比很多被动完成作业的同学强不少了。但我想泼一盆冷水116题只是C语言的入门题库它离会写真实项目还有相当一段距离。刷完这套题你会发现三个明显的变化第一看代码的速度变快了不再是一行一行抠而是按块理解第二遇到报错信息不再害怕能根据错误类型快速定位问题第三开始有了设计的意识写代码之前会先想清楚数据结构是什么、函数怎么划分。这才是116题真正的价值所在。至于下一步方向就看你自己选了继续在OJ里刷更多算法题学习数据结构和算法或者找个真实的小项目练手比如写个命令行版本的学生选课系统、图书管理系统再或者学学C语言和操作系统底层的结合把指针和内存管理的理解再往下扎一扎。无论选哪个方向你的基础已经能支撑你继续往前走了。最后分享一个我自己的习惯把AC过的代码好好保存按题目类型分文件夹存放。过半年再回来看你会发现当年写得很垃圾的代码恰恰是你进步的最直观证明。这种回头看的能力和写代码的能力一样需要练习。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →