用 C 语言 编程实现求一个任意大小整数的精确阶乘值,即:求n!,n是任意大小的整数,n!的结果是精确值。
时间: 2024-09-19 11:18:15 浏览: 47
在C语言中,由于整数溢出的问题,直接计算大整数的阶乘可能会导致结果不准确,特别是对于非常大的数值。因此,我们需要使用一种能够处理大整数的方法来解决这个问题,这通常涉及到高精度计算。一个常见的做法是使用数组或者链表来存储每个数字,并维护每一位的状态。
下面是一个基于递归和数组的简单实现,使用了动态内存分配来存储大整数:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义一个结构体来表示大整数
typedef struct {
unsigned long long *digits;
int size;
} BigInt;
// 初始化大整数
BigInt createBigInt(int n) {
BigInt num;
num.digits = (unsigned long long*)malloc(sizeof(unsigned long long) * (n + 1));
num.size = n;
for (int i = 0; i <= n; ++i)
num.digits[i] = 0;
return num;
}
// 置零大整数
void clearBigInt(BigInt* num) {
free(num->digits);
num->size = 0;
num->digits = NULL;
}
// 阶乘函数,这里仅支持非负整数
BigInt factorial(BigInt num, int n) {
if (n == 0 || n == 1) { // 基本情况,0! 和 1! 都是1
num.digits[0] = 1;
num.size = 1;
return num;
}
BigInt result = factorial(num, n - 1); // 递归调用
// 计算并添加当前位
num.digits[num.size++] = num.digits[0] * n;
for (int i = 1; i < num.size; ++i) {
num.digits[i] += num.digits[i - 1];
if (num.digits[i] > ULONG_MAX) { // 检查是否溢出
num.digits[i] -= ULONG_MAX + 1;
num.digits[i - 1]++;
}
}
return result;
}
// 输出大整数
void printBigInt(BigInt num) {
printf("%llu", num.digits[num.size - 1]);
for (int i = num.size - 2; i >= 0; --i) {
printf("%llu", num.digits[i]);
}
printf("\n");
}
int main() {
int n;
printf("请输入一个非负整数: ");
scanf("%d", &n);
BigInt bigNum = createBigInt(n);
factorial(bigNum, n);
printBigInt(bigNum);
clearBigInt(&bigNum); // 清理内存
return 0;
}
```
阅读全文