高精度算法详解:C++实现大数四则运算与性能优化
先问一个看起来很基础的问题在C里怎么精确计算2的1000次方如果你直接写pow(2, 1000)得到的浮点数早就丢了精度如果硬用long long存编译期就能看到溢出的苗头。答案只有一条路上高精度算法也就是用数组或字符串把超长整数拆成一位一位地存再手动模拟加减乘除。我之前做项目时也遇到类似场景要统计一个持续累加的计数数值轻松突破几十位long long完全兜不住用double又全是误差最后只能老老实实自己实现一套基于数组的高精度运算。写完之后我发现自己顺手搭起了一个可以复用的基础组件后面做阶乘、幂运算、递推数列处理全都靠它。这篇就把高精度算法的完整思路、C实现细节、性能优化和踩过的坑一次讲清楚适合刚接触算法的同学也适合想快速获得一套可落地代码的从业者。1. 为什么要突破整型上限先搞懂天花板在哪1.1 C整型的容量一览很多新手不理解为什么需要高精度觉得long long已经足够大了。那我们先把C整型的容量盘一遍类型位数最大值数量级int32位2,147,483,647约2.1×10^9unsigned int32位4,294,967,295约4.3×10^9long long64位9,223,372,036,854,775,807约9.2×10^18unsigned long long64位18,446,744,073,709,551,615约1.8×10^19__int128GCC扩展128位约3.4×10^38约3.4×10^38看起来数字挺大但一碰到真正的数学问题就露馅了。我随便写段代码感受一下溢出#include bits/stdc.h using namespace std; int main() { long long x 1; for (int i 1; i 25; i) { x * i; cout i ! x \n; } return 0; }运行到21的时候输出已经变成负值了。21!约等于5.1×10^19而long long上限是9.2×10^18直接爆掉。如果题目要求算100!甚至1000!自带整型根本无解。100!约等于9.33×10^157位数超过157位即便用__int128也只能存下它零头的零头。1.2 哪些场景逼着你必须用高精度我总结了几类最常见的需求场景基本上只要遇到其中之一你就要立刻想到高精度大数阶乘n超过20就会溢出long long20!约2.43×10^18刚好还能塞下21!直接爆炸。大数幂运算比如2^1000、3^500这类题目在基础算法练习里出现频率极高。递推数列斐波那契数列第92项是7540113804746346429还没超long long但第93项就已经越界了。卡特兰数、Hanoi塔步数等也都类似。密码学相关的底层运算RSA、大素数判定这种场景动不动就出现1024位、2048位的大整数必须依赖任意精度运算。业务统计中的精确累计我做项目时遇到过需要精确记录一个总数位数到了几十位的情况。任何浮点方案都是错的只能高精度硬扛。还有一个很实际的原因在各种算法题和面试题中高精度经常作为辅助工具出现。你真正要考的是贪心、DP或分治但计算过程需要先解决大数存储。高精度这部分基础不牢主算法写得再漂亮也可能因为一个溢出导致全盘皆输。2. 核心设计思路用数组模拟竖式运算高精度算法的本质就是把数字从CPU原生寄存器里解放出来改用内存里的容器逐位保存再模仿小学竖式的方式完成运算。这个思路一点也不神秘。2.1 存储选型vector 还是 string我见过有人直接用string存高精度数觉得输入输出方便。实际做运算的时候字符和数字的来回转换非常别扭做加法和进位操作更是绕手。我的建议是统一用vector 每一位存一个0~9的数字。理由很简单vector支持随机访问和动态扩容做进位处理时直接修改对应下标位置的元素代码直观且效率高。string在底层也是连续存储但它的元素类型是char算术运算时还得考虑字符编码偏移徒增心智负担。vector 一眼就能看出这是一个数字数组语义比string清晰太多。2.2 数字存放顺序低位在前是唯一正解这是新手最容易纠结的问题高精度数在数组里到底应该高位在前还是低位在前我的答案是默认全部用低位在前也就是数组下标0存个位下标1存十位以此类推。原因有两个所有运算都必须从低位开始算因为进位是从低位往高位传递的。低位在前可以直接用下标i访问对应位进位只需要追加到数组尾部。数组尾部天然对应高位区域加法或乘法产生的新进位直接push_back即可不需要整体移动元素。代价只有一个打印输出时需要倒序遍历。通过一个printBigNum函数就能解决相比运算的便利这点成本完全可以忽略。2.3 字符串与高精度数的互相转换实际输入通常以字符串形式给出因为输入本身就可能超过整型范围。转换的标准写法如下#include bits/stdc.h using namespace std; // 字符串转高精度数低位在前 vectorint toBigNum(const string s) { vectorint a; for (int i (int)s.size() - 1; i 0; i--) { a.push_back(s[i] - 0); } return a; } // 打印高精度数注意倒序输出 void printBigNum(const vectorint a) { for (int i (int)a.size() - 1; i 0; i--) { cout a[i]; } cout \n; }这段代码里要注意两点。第一s[i] - 0利用字符编码做转换是字符运算的基本功。第二输入字符串是高位在前而内部存储是低位在前所以倒着遍历并push_back正好完成顺序翻转。printBigNum则是反向操作把内部存储还原成日常书写顺序。转换完成后所有运算都在vector 上操作结果也统一保持低位在前的格式确保多个运算能无缝串联。3. 四大基础运算的完整实现与核心细节高精度算法的基础就是加减乘除四种运算。下面每个运算我都给出可以直接复用的C实现并重点拆解关键细节。3.1 高精度加法核心就是一个进位标志加法就是小学竖式从个位开始逐位相加超过9就进1。唯一需要额外处理的是最后一位相加后可能还会产生新的进位。// 高精度加法 vectorint addBig(const vectorint a, const vectorint b) { vectorint c; int carry 0; int n max(a.size(), b.size()); for (int i 0; i n; i) { int t carry; if (i (int)a.size()) t a[i]; if (i (int)b.size()) t b[i]; c.push_back(t % 10); carry t / 10; } if (carry) c.push_back(carry); return c; }很多人写加法容易漏掉最后的if (carry)。举个例子99 1个位9110当前位0进位1十位90110当前位0进位1循环结束carry还是1如果不处理结果就是00等于算出来个0。这是加法里最经典的低级错误没有之一。加法的时间复杂度是O(max(m,n))两个数的位数取较大的那个。这个运算几乎不可能再优化因为每一位都必须检查一遍。3.2 高精度减法借位和前导零是两大坑减法比加法麻烦因为涉及借位。我的实现要求调用方保证a b所以实际使用前需要先写一个比较函数// 比较两个高精度数1表示ab0表示相等-1表示ab int cmpBig(const vectorint a, const vectorint b) { if (a.size() ! b.size()) { return a.size() b.size() ? 1 : -1; } for (int i (int)a.size() - 1; i 0; i--) { if (a[i] ! b[i]) return a[i] b[i] ? 1 : -1; } return 0; } // 高精度减法要求 a b vectorint subBig(const vectorint a, const vectorint b) { vectorint c; int borrow 0; for (int i 0; i (int)a.size(); i) { int t a[i] - borrow; if (i (int)b.size()) t - b[i]; if (t 0) { t 10; borrow 1; } else { borrow 0; } c.push_back(t); } while (c.size() 1 c.back() 0) c.pop_back(); return c; }减法必须处理前导零。比如1000 - 999结果应该是1但直接算会得到0001。虽然打印出来一个数是0001数学上没错但在链式运算中后面再做乘法或比较前导零会带来额外干扰。所以每次运算结束后统一去掉高位多余的0至少保留一位这个习惯必须在所有运算里保持一致。比较函数有个小细节先比长度长度不同直接判定大小长度相同再从高到低逐位比较。这个函数不只是减法用后面做除法试商和排序取大时都会反复用到。3.3 高精度乘法两层循环累加再把进位一次搞定乘法实现思路是先不急着进位把所有位置上的乘积累加到一个结果数组里最后统一扫描一遍处理进位。第i位与第j位相乘结果存放在c[ij]上。为什么是ij因为一个数的第i位数值10^i乘以另一个数的第j位10^j乘积落在10^(ij)正好是结果数组的第ij位。// 高精度乘法 vectorint mulBig(const vectorint a, const vectorint b) { vectorint c(a.size() b.size(), 0); for (int i 0; i (int)a.size(); i) { for (int j 0; j (int)b.size(); j) { c[i j] a[i] * b[j]; } } int carry 0; for (int i 0; i (int)c.size(); i) { int t c[i] carry; c[i] t % 10; carry t / 10; } while (c.size() 1 c.back() 0) c.pop_back(); return c; }这里有个性能优化点把边乘边进位改成先累加再统一进位。如果一边乘一边进位内层循环每次都要处理取模和除法而且在累加过程中进位还会干扰后续的乘法结果。先累加后进位内层只有一个加法操作计算量小很多代码也清晰。乘法的时间复杂度是O(m×n)。这是基础版处理上万位的数字时会明显变慢此时一般会上Karatsuba分治乘法复杂度能降到约O(n^1.585)或者直接走FFT快速乘法。这个作为进阶内容后面再展开。3.4 高精度除法必须从高位入手加减乘都是从低位算起唯独除法要反着来从高位开始。因为除法本质上是模拟试商过程要看当前余数拼接下一位之后能除以除数几次。先给出最常用的版本高精度数除以一个普通整型。这个操作在阶乘、进制转换、取模运算里出现频率极高// 高精度除以低精度余数通过引用返回 vectorint divSmall(const vectorint a, int b, int rem) { vectorint c; int r 0; for (int i (int)a.size() - 1; i 0; i--) { r r * 10 a[i]; c.push_back(r / b); r % b; } reverse(c.begin(), c.end()); while (c.size() 1 c.back() 0) c.pop_back(); rem r; return c; }这段代码的思路就是竖式除法从最高位开始当前被除数是上一次的余数乘以10再加上本位数字整除以b得到商的当前位余数传给下一位。reverse那行要特别注意。因为我们从高位遍历得到的商序列是高位在前的而存储约定是低位在前所以需要翻转。很多人第一次写这里容易漏掉结果商的顺序完全颠倒。至于高精度除以高精度核心思路是试商减先比较被除数与除数能减就累加商并做一次减法。朴素写法复杂度O(n×m)代码量翻倍。实际做题中高精度除以高精度更多出现在大数取模场景那些需求通常可以用循环减法简化实现。4. 从写对到写快实操细节与优化心得代码能跑通只是第一步。下面这些实操层面的细节能帮你把代码从能跑提高到跑得又快又稳。4.1 乘法的进位策略边乘边进 vs 统一进位我前面提到乘法有两种写法展开说一下优劣。边乘边进的形式长这样for (int i 0; i (int)a.size(); i) { int carry 0; for (int j 0; j (int)b.size(); j) { int t c[i j] carry a[i] * b[j]; c[i j] t % 10; carry t / 10; } c[i b.size()] carry; }统一进位的写法中间不处理任何进位最后一次性扫描。实测下来位数超过1000位后统一进位明显更快因为内层循环少了一次取模运算。取模在CPU里是相对昂贵的操作能省就省。我自己的习惯是基础实现直接用统一进位版本只有处理超大数时才考虑引入分治乘法。注意统一进位版本里结果数组要预分配mn位否则最后的进位写入会越界。4.2 前导零与边界两个肌肉记忆高精度代码里出现频率最高的bug就是前导零没去掉。前面所有运算最后我都加了while循环去零这绝不是多余而是必须。同时要记住保留最低一位。如果结果是0也不能把数组清空否则打印输出是空的。所以条件统一写成c.size() 1才pop_back保证至少留一个0位。另外这套代码的前提是输入全为正整数。如果要处理负数需要额外维护符号位或者用字符串层面处理负号复杂度会明显上升。竞赛里绝大多数高精度题都不涉及负数先把正向运算吃透负数扩展放在后面再说。4.3 万进制优化同样的代码性能提升一个档次当运算量上来之后十进制逐位存储就太浪费了。把每个数组元素从0~9扩展到0~9999也就是万进制可以让同样长度的vector容纳4倍的数据量加减乘除的循环次数也相应降到四分之一。万进制实现和十进制几乎完全一样只是把取模和除法的基数从10改成10000。以乘法为例// 万进制乘法每个数组元素存0~9999 vectorint mulBig_1e4(const vectorint a, const vectorint b) { vectorint c(a.size() b.size(), 0); for (int i 0; i (int)a.size(); i) { for (int j 0; j (int)b.size(); j) { c[i j] a[i] * b[j]; } } int carry 0; for (int i 0; i (int)c.size(); i) { int t c[i] carry; c[i] t % 10000; carry t / 10000; } while (c.size() 1 c.back() 0) c.pop_back(); return c; }代价只有一个打印时除最高位外其余每一位输出必须补足4位。比如万进制数组[1, 23]表示的是1×10000 23 10023。如果直接把23打印成23输出变成123错得离谱。我第一次用万进制时就在这里被坑过后来强制自己在输出函数里用printf(%04d)格式化中间位。有人会继续往上做亿进制、甚至用unsigned long long做更大基数比如每格存2^32原理都一样只是要把溢出边界算清楚。万进制是最稳妥的平衡点9999×9999 99980001远在int范围内累加两个数也不会溢出int。4.4 编译环境与实测结果我平时直接g一条命令编译g -O2 -stdc17 bigint.cpp -o bigintWindows环境用MinGW或者VS Code里配好C插件都行。但不管在哪个环境编译时一定记得开-O2。高精度运算是循环密集型计算开O2后的性能差距可以达到3到5倍。我自己实测计算10000!开-O2大约0.3秒不开要1.2秒差距非常明显。下面给一个完整的高精度阶乘测试程序把前面零散的知识串起来#include bits/stdc.h using namespace std; // 高精度数乘以低精度整数 vectorint mulSmall(const vectorint a, int b) { vectorint c; int carry 0; for (int i 0; i (int)a.size() || carry; i) { int t carry; if (i (int)a.size()) t a[i] * b; c.push_back(t % 10); carry t / 10; } return c; } // 计算 n! vectorint factorial(int n) { vectorint res; res.push_back(1); for (int i 2; i n; i) { res mulSmall(res, i); } return res; } int main() { int n; while (cin n) { vectorint res factorial(n); cout n ! ; printBigNum(res); // 倒序输出 } return 0; }这个mulSmall是高精度×低精度的专用版本在阶乘场景里效率远高于通用乘法因为它省掉了嵌套循环。实际做题时很多看起来必须用高精度乘法的题目仔细拆解后都会退化成高精度×低精度。能识别出这一点代码量能简化一大半。5. 常见问题与排查技巧实录这一部分都是实打实的经验。下面的问题我几乎每个都在实战中踩过整理出来给你避坑。5.1 典型错误速查表症状根因解决办法加法结果少了一位忘了处理最高位进位循环结束后检查carry非零则push_back减法或乘法结果前面有一串0没去前导零运算后统一循环去零保留至少一位打印结果多了或少了0存储顺序与输出顺序没对齐确认低位在前打印时倒序除法商完全颠倒没做reverse高位遍历产生的商要翻转回低位在前万进制输出缺0中间位补零不到位除最高位外都用%04d格式化输出乘法数组越界结果长度分配不足结果长度设为mn位防止进位越界5.2 测试用例怎么设计高精度代码调试最忌一上来就测超大数。我的习惯是先跑一组极端边界用例覆盖所有进位、借位、前导零路径加法999 1验证最高位进位0 0验证空结果。减法1000 - 999验证连续借位和前导零123456789 - 123456789验证结果为0。乘法999 × 999验证多层进位0 × 100验证长度为1的结果。除法100 / 3验证余数和商的顺序1 / 100验证商为0的情况。这组用例全过了再上大数。我通常拿Python做参照物用Python算一遍同样的大数再用C程序算一遍对比结果是否一致。Python内置大整数是验证C高精度实现最方便的工具没有之一。这个方法看着简单却能帮你省掉大量排查时间。5.3 高精度代码的性能瓶颈在哪真正处理几万位的大数时速度瓶颈会非常明显。我总结了几条实用经验能用高精度×低精度就绝不用高精度×高精度。阶乘、幂运算这类场景天然符合这个规律。优先上万进制改动简单收益巨大。对几千位的数乘法考虑Karatsuba对几万位的数就得上FFT了。输入输出用C风格的scanf/printf或者关掉cin/cout同步ios::sync_with_stdio(false)。高精度运算过程伴随大量IO这个环节的耗时占比不小。关于FFT乘法提一句原理就够了两个数组的卷积恰好就是乘法的累加过程FFT能在O(n log n)时间内完成卷积因此可以用来做超大数乘法。不过FFT涉及浮点误差和预处理属于进阶玩法初学者先把基础四则运算吃透更现实。5.4 与其他现成方案的取舍可能有人会问C里不是有Boost的cpp_int吗Python的int不是也直接支持大数吗这个现实问题确实值得说。我的看法是如果是写业务代码能用现成库就用现成库没必要重复造轮子。但如果是学习算法、应对竞赛或者需要深度控制性能嵌入式环境、内存受限场景都是典型例子自己实现一遍高精度是必须的基本功。更重要的是你理解了底层实现之后再回头用cpp_int这类库时心里会特别有底出了问题也知道大概卡在哪个环节。写在最后高精度算法这套东西说难不难说简单也不简单。它的每一行逻辑都是小学数学竖式的翻版但真正把它写对、写快、写稳需要你对进位、借位、前导零这些细节有近乎苛刻的敏感。我个人最大的体会是这类算法题特别适合用来训练工程化思维先设计存储结构再实现核心操作最后用边界用例做验证。这个流程和做大型软件工程的思路完全一致。最后分享一个实用小技巧我每次写完一个新的高精度运算函数都会顺手放进一个统一的测试脚本里用Python随机生成大数对与C结果自动对比。这个流程看着繁琐但坚持下来你的高精度代码会可靠到可以放心复用。希望这篇能帮你少走几条我走过的弯路。

相关新闻

C#重载==运算符:null==null必须为true的完整实现指南

C#重载==运算符:null==null必须为true的完整实现指南

做C#开发这些年,凡是绕过“值相等”这道坎的,基本都在 null 上栽过跟头。类的 默认比的是引用,可业务里我们经常要的是“内容相同就算相等”。一旦动了重载 的念头,第一个要面对的坑就是: null null 必须是…

2026/10/1 14:09:53 阅读更多 →
C#类值相等与null语义:Equals、GetHashCode和==重载完整指南

C#类值相等与null语义:Equals、GetHashCode和==重载完整指南

做C#开发这些年,我碰到过不少跟对象比较有关的诡异现象。两个对象身上的字段明明一模一样,用比较却返回 false;两个变量都老老实实赋了 null,一比,要么行为不符合预期,要么直接抛空引用异常。后来才意识到&…

2026/10/1 14:09:12 阅读更多 →
Java基础学习路线与面试实战全拆解

Java基础学习路线与面试实战全拆解

经常有读者私信问我:Java基础到底怎么学?学了半年基础,一到面试还是被“面向对象、集合、并发”连环问给问懵;刷了不少八股文,真让他上手写个小程序又无从下手。今天这篇东西,就是根据大家最近的关注点——…

2026/10/1 15:32:22 阅读更多 →

最新新闻

多智能体系统上下文工程:透明架构引擎设计与实践

多智能体系统上下文工程:透明架构引擎设计与实践

刚开始做多智能体系统的时候,我被一个问题折磨了很久:明明每个Agent的提示词都写得非常完整,该定义的规则定义了,该给的示例给了,但一旦把三五个Agent串起来,整个系统的行为就变得像随机游走——今天能跑通…

2026/10/2 15:04:18 阅读更多 →
AI编码代理上下文工程实战:ChatMemory滑动窗口与Context-mode MCP全解析

AI编码代理上下文工程实战:ChatMemory滑动窗口与Context-mode MCP全解析

跟AI编码代理打交道这两年,最让我崩溃的从来不是模型不够聪明,而是它“记性”太差。上下文工程这个词,最初听起来像学术黑话,直到我在一个连续重构的场景里被同一个坑绊倒三次,才意识到上下文不是一个容量问题&#xf…

2026/10/2 15:04:18 阅读更多 →
OpenCode实战指南:终端里的AI结对编程代理完全解析

OpenCode实战指南:终端里的AI结对编程代理完全解析

最近不少朋友在问我OpenCode到底怎么样,尤其是那些已经在用Cursor、GitHub Copilot,又想试试终端AI工作流的人。我在自己的项目里跑了几个月,最大的感受是:OpenCode不是又一个IDE插件,它是一个真正“住在终端里的AI结对…

2026/10/2 15:04:18 阅读更多 →
自动化测试结果监控全攻略:从采集到告警的精细化实践

自动化测试结果监控全攻略:从采集到告警的精细化实践

在自动化测试这条路上,我见过太多团队把精力花在“写脚本”上,脚本一多、跑起来一片绿就觉得万事大吉。等工作半年、用例上千,问题就开始露头了:昨天还全线通过的用例,今天莫名其妙挂了一片,是代码改了&…

2026/10/2 15:04:18 阅读更多 →
Linux ptrace调试机制深度解析:从childRE看进程控制权本质

Linux ptrace调试机制深度解析:从childRE看进程控制权本质

1. 这不是一道“普通”的逆向题:从BUUCTF [2019红帽杯]childRE看真实CTF逆向的底层逻辑你点开BUUCTF,搜到[2019红帽杯]childRE,点进去看到一个Linux ELF文件,名字叫childre——注意,是小写re,不是RE。很多人…

2026/10/2 15:04:18 阅读更多 →
百度云分享链接批量检测:用代码快速筛出失效链接

百度云分享链接批量检测:用代码快速筛出失效链接

管理一个攒了好几年的网盘链接库,迟早会碰到同一个扎心场景:点开收藏夹里几十条分享链接,一条条点过去,一半以上提示"你访问的页面不存在"或者"链接已失效"。手动排查一遍,半小时没了,…

2026/10/2 15:03:18 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →