鸽巢排序
分享一个思路极其朴素的排序算法实现。鸽巢排序(Pigeonhole Sort)是个思路极其朴素的算法:适用于元素数量和取值范围大致相同的场景。 基本思路 找到数组的最大值 max 和最小值 min,取值范围就是 range = max - min + 1 开一个大小为 range 的”鸽巢”数组,初始为空 遍历原数组,每个元素 arr[i] 放进下标为 arr[i] - min 的鸽巢里 顺序遍历所有鸽巢,把非空的元素依次放回原数组 时间复杂度 O(n + Range),n 是元素个数,Range 是取值范围。 代码实现12345678910111213141516171819202122232425void pigeonholeSort(int arr[], int n){ int min = arr[0]; int max = arr[0]; int range, i, j, index; for (int a = 0; a < n; a++) { if (arr[a] > max) max = a...
抽象代码:看不见的循环体
先上完整代码。这是原版原样,一个字都没改——它编译零警告,运行也正常退出。你能看出它输出了什么吗? 坑人的c语言.c123456789#include <stdio.h>int main(){ int i = 0; for(i = 0; i < 114514; ++i) ...
抽象代码:把中文藏进 int 数组
先看运行结果——一个 32KB 的 C++ 程序,运行后在屏幕上打出一句话: 1嵌入式基地YYDS 这句话在源代码里一个汉字都没有。它藏在哪?藏在一个 int 数组里,而且数组里的每个数字,用的还是不同的进制。完整源码如下,请注意开头的 #define eval 和数组里反复出现的 eval(...)——后面会讲它们是干嘛的: 加密中文demo.cpp123456789101112131415161718192021222324252627282930313233#include <stdio.h>#include <locale.h>#define eval(everying) everyingint main(){ // int c = 10; // int d = 5; // int rs3 = c++ + ++c - --d - ++d + 1 + c--; // c++ + ++c = 10 + &c = 10 + 12 = 22 // 22 - --d = 22 - 4 = 18 // 18 - ++d = 18 - 5 =...
抽象代码:从 drink()() 到百层 typedef 之旅
📌 更新(2026-08-31):本文写于 2023 年 10 月。发布前用 2026 年的新版 GCC 把全流程重新复现了一遍,文中的编译器行为说明(含 GCC 14 的变化)即来自这次复现。 系列缘起那篇文章里说过:一位同学告诉我 C 语言里有”返回值为函数指针的函数”,我写下了 drink()(),然后问题就变成了——**能 drink()()() 吗?能无限连下去吗?**这篇就是那个问题的完整答案,也是整个抽象代码系列的起点详解。 第一步:typedef 套娃drink()() 能跑两连,第三连就撑不住了——因为返回类型太”窄”。解法是让每一层 typedef 都”返回上一层”: 12345678910111213typedef long long (*p_fun)(void);typedef p_fun (*p_fun2)(void);p_fun2 fun(){ printf("()"); return fun;}int main(){ fun()()(); // 三连成功} 每套一...
用 C 语言打造 Cheat Engine 练习对象
玩 Cheat Engine(CE)的时候需要一个”练习对象”——写一个小程序,让它维护一个不断变化的数值,然后用 CE 去扫描和修改它。这里记录两个练习用的目标程序。 第一课:直接修改 malloc 出来的变量12345678int *p_num = (int *)malloc(sizeof(int));srand(time(NULL));*p_num = rand() % 100 + 100; // 初始值:100~199 的随机数while(getchar()){ printf("%d", *p_num); (*p_num)--;} 每次按回车,数值减 1。练习流程:先用 CE 的”未知的初始值”开始扫描,按几次回车让数值递减后用”减少了的数值”继续扫描,锁定地址后把它改成 999——程序打印的数字就听你的了。 第二课:结构体指针的偏移12345678910typedef struct{ char name[20]; int hp; int exp;}playerType, *...
用 C 语言实现莫尔斯电码编码
莫尔斯电码是最古老的数字编码之一:每个字母对应一串点和划。用 C 语言实现英文字母到莫尔斯电码的编码,核心代码只要十几行。 思路把 26 个字母的莫尔斯码按字母表顺序存进一个字符串指针数组,编码时把字符减去 'a' 得到下标,直接查表输出: 1234567891011121314char *code[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-.", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", &quo...
当 include 遇上 MP4
一个大胆的实验:把写好的头文件 GenShin.h 改名成 GenShin.mp4,然后照常 #include 它,编译器会买账吗? 实验材料:这个”mp4”其实是纯文本先用 file 命令验一下它的真身——GenShin.mp4: C source, ASCII text。它就是一个普普通通的头文件,只是后缀被改了: GenShin.mp4123456#ifndef __GenShin_H__#define __GenShin_H__#define NUM 114514 #endif // !__GenShin_H__ 实验代码main.c12345678910111213#include <stdio.h>#include "GenShin.mp4"int main(){ printf("%d\n", NUM); // NUM 就来自上面这个"mp4" int num = 0; for(int* i = # ; i++) { ...
抽象代码:尊嘟假嘟
又是先上完整代码。下面这个程序能编译、能运行,但它看起来像是谁打字的时候手滑了: 抽象-尊嘟假嘟.c1234567891011121314151617181920212223#include <stdio.h>#include <stdlib.h>#include <time.h>char str[][4] = <%"o.o","O.O"%>;int fun(int *p){ printf("%p\n", p); printf("%p\n", p+1);}int main()<% int a; fun(&a); srand((time(0))); printf("%s\n", (rand() % 2)[str]); int b[10] = {0,1,2,3,}; printf("%d", *(&b[0]+1...
抽象代码:分号的艺术
C 语言里,分号是语句的句号。规则人人都懂:句子写完,分号收尾。 但分号其实是”语句终止符”,它并没有规定自己必须站在句尾。于是有了下面这个程序——每个分号都搬家搬到了下一行的行首: 用分号作为缩进.c123456789101112#include <stdio.h>int main(int argc, char* arg[]){;;;;int i = 0;;;;while(i < 10){;;;;;;;;printf("%d\n", i);;;;;;;;i++;;;;};;;;return 0;} 第一眼:int i = 0 后面没有分号,这能编译?——能。真机运行,输出干干净净的 0 到 9: 12345012...9 原理:把分号从句尾搬到句首关键在于理解分号到底”属于谁”。C 编译器眼里,换行就是普通的空白,int i = 0 下一行行首的那四个分号,其中第一个分号恰好补上了上一句缺的句号,剩下三个分号是三条合法的空语句(empty statement,什么都不做)。 也就是说,编译器看到的...
BigInterge 开发记:当 long long 装不下的时候
long long 最大能存 9223372036854775807,十九位。想算 29 位数除以 26 位数?没有现成的类型能装。2023 年 3 月 8 日我开了这个项目:用字符串存数字,把小学竖式翻译成 C 代码,实现大整数的加减乘除。完整源码在 GitHub 的 Mathematics-System 仓库里,和矩阵库 Matrix 住在一个屋檐下。文件夹里的更新记录原话是这么写的: 📌 更新(2026-08-31):为写这篇重新编译复现了全部输出(含那段 gets 输入),运行效果一节均为 2026 年的真实运行记录。 12342023.3.8完成基础加减乘除运算,并进行基本的封装,实现了对象池,方便最后统一销毁对象2023.8.31重新捡起烂摊子,装备可以多文件英文路径调试的g++调试器,修复几个小bug 半年后捡起来继续打磨,就有了这篇文章里的最终形态。 数据结构:一个字符串加一个符号大整数本体是一个朴素的结构体——数字的绝对值用字符串存,符号单独一位: 123456789101112typedef enum __Positive_negative{...
