news 2026/4/15 9:01:09

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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)

避免重复计算。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 15:31:16

c++练习题-双分支

1626. 暑假的旅游计划问题描述期末考试结束了&#xff0c;小华语文、数学、英语三门功课分别考了 x、y、z 分&#xff0c;小华的家长说&#xff0c;如果小华三门功课的平均分在90 分或者 90 分以上&#xff0c;那么就去北京旅游&#xff0c;如果在 90 分以下&#xff0c;那么就…

作者头像 李华
网站建设 2026/4/14 8:50:15

计算机科学与技术

一、为什么选择计算机科学与技术&#xff1f;—— 不止于代码的无限可能很多人对计科专业的第一印象是 “敲代码”&#xff0c;但真正深入后会发现&#xff0c;这是一门融合逻辑思维、创新能力与解决复杂问题的综合性学科。它的核心魅力在于 “通用性”—— 小到手机 APP 的交互…

作者头像 李华
网站建设 2026/4/7 11:17:00

杨植麟率Kimi逆袭:K2开源风暴改写AI竞争格局

2025年7月的AI圈被一场突如其来的"开源风暴"席卷。月之暗面&#xff08;Moonshot AI&#xff09;在7月11日抛出的万亿参数MoE模型Kimi K2&#xff0c;不仅在技术圈掀起巨浪&#xff0c;更以"性价比之王"的姿态重塑了全球大模型竞争的游戏规则。这场看似突然…

作者头像 李华
网站建设 2026/4/15 5:15:12

为什么优秀管理者更需要“摸鱼”?

你的公司里有没有发生过这样的情况&#xff1a; A总监是公认的“拼命三郎”。他的日程表被会议填满&#xff0c;微信永远秒回&#xff0c;周末也在处理工作&#xff0c;团队有任何问题他都冲在第一线&#xff0c;996几乎没有空隙。 B总监看起来没那么忙。他经常在办公室窗边发…

作者头像 李华
网站建设 2026/4/14 22:30:54

MySQL快速入门

MySQL作为开源的关系型数据库&#xff0c;广泛应用于网站开发、数据存储等领域。本篇博客以“学生信息管理”为案例&#xff0c;用5个步骤带你轻松掌握核心操作&#xff0c;无需编程基础也能快速上手。 步骤1&#xff1a;安装与连接MySQL 安装&#xff1a;官网下载MySQL Commun…

作者头像 李华
网站建设 2026/4/12 10:27:50

论文查重合格标准:10大平台全方位测评指南

论文查重合格标准&#xff1a;10大平台全方位测评指南 10大查重平台核心指标对比 排名 平台名称 检测速度 数据库覆盖 价格区间 适用场景 特色功能 1 aibiye ⚡⚡⚡⚡⚡ 中英文主流 中档 终稿查重 智能降重AIGC检测 2 aicheck ⚡⚡⚡⚡ 国内最全 低档 初稿…

作者头像 李华