从PAT水仙花数到猜数字游戏用C语言玩转翁恺老师第四章的5个经典习题学习编程最怕什么枯燥的语法规则、冰冷的代码逻辑、重复的习题训练。但编程真的只能这样吗让我们换个视角——把每一道编程题都当作一个有趣的游戏关卡用C语言这把钥匙来解锁其中的乐趣。1. 整数排列组合数字魔方的解谜艺术想象你手中有四个连续的数字积木比如2、3、4、5。如何用它们搭建出所有可能的三位数城堡且每个城堡的数字都不重复这就像在玩一个数字版的魔方游戏。#include stdio.h void printCombinations(int start) { int cnt 0; for(int i start; i start4; i) { for(int j start; j start4; j) { for(int k start; k start4; k) { if(i ! j i ! k j ! k) { printf(%d%d%d , i, j, k); if(cnt % 6 0) printf(\n); } } } } }提示这个三重循环就像三个转动的魔方层if条件确保每个数字位置都是独特的。游戏化学习技巧把输出结果想象成解锁的成就列表尝试修改代码让输出按不同顺序排列挑战自己能否用递归实现同样功能2. 水仙花数寻找数字界的阿凡达水仙花数就像是数字世界中的特殊生物它们具有一种神奇的自我镜像特性。一个N位数其每位数字的N次幂之和等于它本身。比如153这个水仙花精灵1³ 5³ 3³ 153。#include math.h void findNarcissisticNumbers(int N) { int start pow(10, N-1); int end pow(10, N) - 1; for(int num start; num end; num) { int sum 0, temp num; while(temp 0) { int digit temp % 10; sum pow(digit, N); temp / 10; } if(sum num) printf(%d\n, num); } }探索发现3位水仙花数153, 370, 371, 4074位水仙花数1634, 8208, 94745位水仙花数54748, 92727, 93084注意随着位数增加计算量会指数级增长7位水仙花数只有4个你能找到它们吗3. 九九乘法表编程世界的第一个沙盒打印九九乘法表就像在代码世界建造第一个属于自己的小花园。通过控制行列你可以创造出各种形状的植物排列。void printMultiplicationTable(int N) { for(int i 1; i N; i) { for(int j 1; j i; j) { printf(%d*%d%-4d, j, i, j*i); } printf(\n); } }创意变形挑战上三角版乘法表右对齐钻石形状乘法表彩色终端输出使用ANSI转义码变形类型关键代码改动难度上三角调整内循环起始条件★★☆钻石形结合空格和对称性★★★彩色版添加\033[颜色代码★★☆4. 素数狩猎数学王国的寻宝游戏在数字丛林中寻找素数就像在探险地图上标记宝藏位置。设定搜索范围[M,N]统计其中的素数个数并求和。int isPrime(int num) { if(num 2) return 0; for(int i 2; i*i num; i) { if(num % i 0) return 0; } return 1; } void countPrimes(int M, int N) { int count 0, sum 0; for(int i M; i N; i) { if(isPrime(i)) { count; sum i; } } printf(素数个数: %d\n总和: %d\n, count, sum); }性能优化之路基础版检查2到num-1效率最低优化版检查2到√num中等效率进阶版埃拉托斯特尼筛法最高效处理区间素数5. 猜数字游戏编程世界的第一个互动冒险让我们把传统的猜数字习题升级成一个真正的游戏体验。系统随机生成数字玩家有N次机会猜测根据猜测次数给出不同评价。#include stdlib.h #include time.h void guessNumberGame() { srand(time(0)); int secret rand() % 100 1; int maxGuesses, guess, attempts 0; printf(设置最大猜测次数: ); scanf(%d, maxGuesses); while(1) { printf(你的猜测(1-100): ); scanf(%d, guess); attempts; if(guess 0) { printf(提前退出游戏\n); break; } if(guess secret) { if(attempts 1) printf(Bingo! 一发命中!\n); else if(attempts 3) printf(Lucky You! 运气不错!\n); else if(attempts maxGuesses) printf(Good Guess! 终于猜对了\n); break; } else if(guess secret) { printf(Too small\n); } else { printf(Too big\n); } if(attempts maxGuesses) { printf(Game Over! 正确答案是%d\n, secret); break; } } }游戏扩展创意添加难度级别调整数字范围实现高分记录系统添加提示功能需消耗尝试次数多人对战模式6. 从习题到项目构建你的C语言游乐场现在让我们把这些分散的游戏关卡整合成一个完整的编程游乐场。用户可以自由选择想玩的游戏。void showMenu() { printf(\n C语言编程游乐场 \n); printf(1. 数字排列组合\n); printf(2. 水仙花数探索\n); printf(3. 创意乘法表\n); printf(4. 素数狩猎\n); printf(5. 猜数字游戏\n); printf(0. 退出\n); printf(请选择: ); } int main() { int choice; do { showMenu(); scanf(%d, choice); switch(choice) { case 1: { int start; printf(输入起始数字(1-6): ); scanf(%d, start); printCombinations(start); break; } case 2: { int N; printf(输入位数(3-7): ); scanf(%d, N); findNarcissisticNumbers(N); break; } // 其他case类似... case 5: guessNumberGame(); break; } } while(choice ! 0); return 0; }项目进阶方向添加文件存储功能保存游戏记录实现图形界面版本如使用EasyX添加音效和更多视觉反馈开发网络对战功能