用C++语言编写一个计算阶乘的函数,并在此基础上计算e,已知 e = 1 + 1/1! + 1/2! ......并尽量计算得到e的高精度值。
时间: 2024-05-02 21:18:06 浏览: 62
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_DIGIT 1000 // 最大位数
// 多位数结构体
typedef struct {
int digit[MAX_DIGIT]; // 数字数组
int len; // 数字位数
} BigInt;
// 初始化多位数
void init(BigInt *num) {
for (int i = 0; i < MAX_DIGIT; i++) {
num->digit[i] = 0;
}
num->len = 0;
}
// 多位数赋值
void assign(BigInt *num, int n) {
init(num);
if (n == 0) {
num->digit[0] = 0;
num->len = 1;
return;
}
while (n > 0) {
num->digit[num->len++] = n % 10;
n /= 10;
}
}
// 多位数加法
void add(BigInt *a, BigInt *b, BigInt *result) {
int carry = 0;
for (int i = 0; i < a->len || i < b->len; i++) {
int sum = a->digit[i] + b->digit[i] + carry;
result->digit[result->len++] = sum % 10;
carry = sum / 10;
}
if (carry > 0) {
result->digit[result->len++] = carry;
}
}
// 多位数乘法
void multiply(BigInt *a, int b, BigInt *result) {
int carry = 0;
for (int i = 0; i < a->len; i++) {
int product = a->digit[i] * b + carry;
result->digit[result->len++] = product % 10;
carry = product / 10;
}
if (carry > 0) {
result->digit[result->len++] = carry;
}
}
// 计算阶乘
void factorial(BigInt *result, int n) {
assign(result, 1);
for (int i = 2; i <= n; i++) {
BigInt tmp;
init(&tmp);
multiply(result, i, &tmp);
*result = tmp;
}
}
// 计算e
void e(BigInt *result, int precision) {
assign(result, 1); // 初始化为1
BigInt tmp;
init(&tmp);
for (int i = 1; i <= precision; i++) { // 计算1/i!
multiply(result, i, &tmp);
assign(result, 1);
add(&tmp, result, result);
init(&tmp);
}
}
// 输出多位数
void print(BigInt *num) {
for (int i = num->len - 1; i >= 0; i--) {
printf("%d", num->digit[i]);
}
}
int main() {
BigInt result;
init(&result);
int n;
printf("请输入n:");
scanf("%d", &n);
factorial(&result, n);
printf("%d! = ", n);
print(&result);
printf("\n");
e(&result, 100); // 计算e,精确到小数点后100位
printf("e = ");
print(&result);
printf("\n");
return 0;
}
```