计算大n(≈100)的n!结果错误,求C语言数组实现修复方案
大阶乘计算代码错误分析与修正
问题根源
- 数组未初始化:局部数组
a[1000]未初始化,未赋值的元素是随机垃圾值,当错误扩展数组长度时会输出这些随机数。 - 进位处理逻辑错误:在每一位计算时,只要有carry就直接赋值给下一位并增加数组长度
n,这会导致同一次乘法循环中重复处理进位,甚至将多位数的carry直接存入单个数组元素(违反每个元素存一位数字的设计),最终计算混乱。
修正后的代码
#include <stdio.h> #include <string.h> int main() { int a[1000]; memset(a, 0, sizeof(a)); // 初始化数组所有元素为0,避免随机值干扰 int n = 1; a[0] = 1; int limit = 100; for (int i = 2; i <= limit; i++) { int carry = 0; // 遍历当前所有有效位数,计算每一位结果与进位 for (int j = 0; j < n; j++) { int prod = a[j] * i + carry; a[j] = prod % 10; carry = prod / 10; } // 处理剩余的进位(可能是多位数) while (carry > 0) { a[n] = carry % 10; carry = carry / 10; n++; } } // 从高位到低位输出结果 for (int i = n - 1; i >= 0; i--) printf("%d", a[i]); return 0; }
修正说明
- 用
memset初始化数组所有元素为0,彻底避免未初始化的随机值影响输出。 - 将进位处理逻辑移到当前有效位数遍历完成之后:通过循环拆分多位数carry,依次存入数组,确保每个数组元素仅存储一位数字,同时正确扩展有效长度
n,避免同一次乘法中重复修改n导致的循环异常。
内容的提问来源于stack exchange,提问作者SF40
相关产品推荐
相关产品推荐

