当前位置: 首页 > news >正文

C语言实现阶乘(附带源码)

一、项目背景详细介绍

阶乘(Factorial)是数学中最基础、最常见的运算之一,记作:

它广泛应用于:

  • 排列组合计算

  • 概率论

  • 数学级数

  • 数值分析

  • 算法竞赛

  • 递归函数教学

  • 栈帧结构教学

  • 大整数计算

由于阶乘随 n 增大增长极快,因此它也是数值计算中:

  • 溢出检测

  • 大整数存储

  • 算法效率比较

  • 递归/迭代的性能差异

的典型教学案例。

本项目将从基础到进阶,实现 C 语言版本的阶乘,包括:

  • 递归版本 factorial_recursive

  • 迭代版本 factorial_iterative

  • 大整数版本 factorial_bigint(数组表示法)

  • 错误检测

  • 输入合法性判断

  • 性能差异说明

同时,本项目完全按照你的博客格式要求,结构完整、详细、可直接用于课堂教学或技术博客输出。


二、项目需求详细介绍

本项目的需求主要包括:

(1)实现三种阶乘算法

  1. 递归法(Recursive)

  2. 迭代法(Iterative)

  3. 大整数方法(Big Integer Factorial)

(2)要求具备输入检查

  • n 必须为非负整数

  • n 过大会提示溢出风险(普通 int/long long 无法计算大数阶乘)

(3)输出格式友好

  • 普通阶乘输出普通整数

  • 大整数算法输出完整、高精度长整数

(4)要求代码结构清晰,函数分类明确

  • 各个算法独立为函数

  • 主函数可选择算法进行测试

(5)要求兼容 32 位与 64 位平台


三、相关技术详细介绍

实现阶乘涉及多个核心技术点,本章逐一讲解。


1. 递归调用(Recursion)

C 语言允许函数调用自身,这叫做递归

递归函数必须具备:

  • 终止条件(Base Case)

  • 递推关系(Recursive Case)

例如:

5! = 5 * 4! 4! = 4 * 3! ...... 1! = 1


2. 迭代(Iteration)

迭代是使用循环结构(for / while)不断累乘。

相比递归:

  • 不会消耗额外栈帧

  • 性能更好

  • 不会发生栈溢出


3. 大整数存储(Big Integer)

由于 20! 已经超出了 64 位整数的范围,因此要计算大整数阶乘,需要采用:

数组存储法

使用一个数组int digits[10000],每一位存储一个十进制数字。

例如 12345 存储为:

indexdigit
05
14
23
32
41

乘法时逐位处理并管理进位。

这是 C 语言中最常见的大整数算法。


4. 溢出检测(Overflow Detection)

普通整数类型范围:

类型大约最大阶乘
int(32位)12!
long long(64位)20!

我们会:

  • 当 n > 20 时禁止普通阶乘运算

  • 自动转为大整数算法


四、实现思路详细介绍

本章节讲解程序整体结构。


函数结构设计

  1. unsigned long long factorial_iterative(int n);
    实现普通迭代阶乘

  2. unsigned long long factorial_recursive(int n);
    实现递归阶乘

  3. void factorial_bigint(int n);
    输出大整数阶乘

  4. void multiply(int x, int digits[], int *size);
    大整数乘法

  5. int main();
    选择使用算法并测试


核心逻辑流程

  1. 输入 n

  2. 判断 n 的合法性

  3. 如果 n ≤ 20
    → 可以用递归或迭代算法

  4. 如果 n > 20
    → 必须使用大整数算法

  5. 输出结果


五、完整实现代码

/************************************************************ * C语言实现阶乘(Factorial) * 包含: * 1. 迭代版本 * 2. 递归版本 * 3. 大整数版本(数组高精度) * 4. 输入检查与测试 ************************************************************/ #include <stdio.h> #include <stdlib.h> /************************************************************ * 迭代法阶乘(n <= 20 可安全计算) ************************************************************/ unsigned long long factorial_iterative(int n) { unsigned long long result = 1; for (int i = 1; i <= n; i++) { result *= i; } return result; } /************************************************************ * 递归阶乘(n <= 20) ************************************************************/ unsigned long long factorial_recursive(int n) { if (n <= 1) return 1; return n * factorial_recursive(n - 1); } /************************************************************ * 高精度大数阶乘辅助:将当前大整数 digits[] 乘以 x ************************************************************/ void multiply(int x, int digits[], int *size) { int carry = 0; for (int i = 0; i < *size; i++) { int product = digits[i] * x + carry; digits[i] = product % 10; // 当前位 carry = product / 10; // 进位 } while (carry) { digits[*size] = carry % 10; carry /= 10; (*size)++; } } /************************************************************ * 大整数计算 n!(支持超大 n) ************************************************************/ void factorial_bigint(int n) { int digits[10000]; // 存储结果的数组 int size = 1; // 当前有效数字个数 digits[0] = 1; // 初始值 1! for (int i = 2; i <= n; i++) { multiply(i, digits, &size); } // 逆序输出(高位在后) printf("%d! = ", n); for (int i = size - 1; i >= 0; i--) { printf("%d", digits[i]); } printf("\n"); } /************************************************************ * 主函数 ************************************************************/ int main() { int n; printf("请输入一个非负整数 n:"); scanf("%d", &n); if (n < 0) { printf("错误:阶乘不定义负数!\n"); return 0; } if (n <= 20) { printf("[迭代法] %d! = %llu\n", n, factorial_iterative(n)); printf("[递归法] %d! = %llu\n", n, factorial_recursive(n)); } else { printf("n 超过 20,普通 long long 溢出,自动启用大整数算法。\n"); factorial_bigint(n); } return 0; }

六、代码详细解读


1. factorial_iterative

  • 使用 for 循环累乘

  • 时间复杂度 O(n)

  • n ≤ 20 时不会溢出

  • 最安全稳定的普通阶乘算法


2. factorial_recursive

  • 通过递归关系n * factorial(n-1)实现

  • 有清晰数学意义

  • 若 n 过大可能栈溢出


3. multiply

  • 这是高精度阶乘的核心

  • 将数组表示的大整数乘以一个普通整数 x

  • 支持无限进位处理

  • 时间复杂度 O(size)


4. factorial_bigint

  • 用 digits[] 数组存储阶乘

  • 每次循环乘以 i(2 到 n)

  • 最终逆序输出结果

  • 可支持上千位的大数阶乘


5. main

  • 输入判断

  • 自动选择普通算法或大整数算法

  • 提供友好提示


七、项目详细总结

本项目从零开始实现了完整、可靠、教学级的阶乘计算系统,包含:

  • 迭代的效率与稳定性

  • 递归的数学美感

  • 大整数阶乘的工程价值

通过本案例,读者能掌握:

  • C 函数设计

  • 递归思想

  • 数组模拟大整数

  • 溢出检测

  • 复杂算法的分解与组件化实现

该项目非常适合初学者与教学场景,也可作为数值分析课程的实验项目。


八、项目常见问题及解答

Q1:为什么普通 long long 只能计算到 20!?

因为 21! > 2^63,会导致溢出。


Q2:递归比迭代慢吗?

是的。
迭代不需要压栈与出栈,每次调用开销更小。


Q3:大整数阶乘可以计算多大?

取决于数组大小
本代码支持约 8000~9000 位数字。


Q4:大整数算法为什么要逆序存储?

因为计算方便(低位在前),输出时再反转即可。


九、扩展方向与性能优化

以下是本项目可扩展的方向:


1. 使用动态数组(malloc)存储大整数

支持几百万位的大数。


2. 使用 Karatsuba 乘法加速

将大整数乘法从 O(n²) 优化为 O(n^1.58)。


3. 使用多线程并行分段乘法

加速计算 10000! 或更大阶乘。


4. 输出格式化(每 3 位加逗号)

让输出更易读。


5. 实现阶乘缓存(Memoization)

避免重复计算。

http://www.jsqmd.com/news/79572/

相关文章:

  • 阿里通义实验室发布Wan2.2开源视频模型:MoE架构革新引领AIGC创作新范式
  • 职场中令领导同事反感的行为(不定期更新)
  • 5个秘诀让你的Windows右键菜单秒响应:终极解决方案揭秘
  • 超级计算力量:一文看懂GPU并行计算CUDA
  • 喜马拉雅音频数据采集:API接口分析与加密音频链接解密实战
  • 百度网盘下载工具终极指南:快速突破限速的完整教程
  • 深入Ascend C(三):构建端到端自定义LayerNorm算子与性能调优实战
  • 去哪儿网航班数据采集:API接口分析与加密参数解密实战
  • LeetCode热题100--215. 数组中的第K个最大元素--中等
  • 2024年8月中文大模型战力榜:国产模型全面崛起改写全球竞争格局
  • jsonnet介绍和使用
  • Redis持久化机制详解:RDB和AOF对决,哪个更胜一筹?
  • JavaScript 与 WebAssembly 的零拷贝交互:使用共享线性内存(Linear Memory)实现超大数据传输
  • 考研408--组成原理--day7--指令扩展操作码寻址
  • C语言实现幂级数(附带源码)
  • GCC完全指南:从编译基础到高级项目构建(超详细)
  • JavaScript 全局对象 `globalThis` 的多环境统一:各引擎在实现跨环境引用时的设计权衡
  • JavaScript 的参数对象 `arguments` 与 命名参数的同步行为:在非严格模式下的内存陷阱
  • Flutter 通用弹窗组件 CustomDialogWidget:全自定义布局 + 多场景适配
  • 计算机科学与技术
  • 突破大模型推理瓶颈:阶跃星辰提出MFA机制,KV缓存降幅超93%且性能反升
  • Flutter 通用列表项组件 CommonListItemWidget:全场景布局 + 交互增强
  • 突破性图像编辑模型Qwen-Edit-2509 LoRa发布:实现精准镜头控制与多视角生成
  • XTOOL InPlus IK618 One-Year Update Service: Keep Your Diagnostics Current for European/American Cars
  • MiniCPM-Llama3-V 2.5震撼发布:重新定义多模态大模型性能边界
  • ContextMenuManager:5个立竿见影的技巧让Windows右键菜单飞起来
  • League Akari智能助手:英雄联盟玩家的游戏优化新选择
  • 视频生成效率革命:LightX2V团队发布LightVAE/TAE系列优化模型,平衡画质、速度与显存
  • [AI编程] ClaudeCode:智能体编程的最佳实践
  • 自建项目管理平台:用 Focalboard+cpolar 打破协作边界