C++高精度计算实现思路
一、核心算法原理
-
数据结构选择
使用整型数组存储大数,每位数字用数组元素表示(逆序存储便于进位处理)
- 示例:数字
120
存储为[0, 2, 1]
(数组索引0对应个位)
- 示例:数字
-
基本运算规则
- 加法/乘法:逐位运算后处理进位
- 阶乘计算:迭代乘法(
i! = (i-1)! × i
)并动态扩展数组长度 - 累加求和:依次将每个阶乘结果加入总和数组中
二、关键实现步骤
问题场景:计算 1!+2!+…+n!(n≤50)
- 初始化数组
int sum[MAX] = {0}; // 存储总和 int fact[MAX] = {1}; // 存储当前阶乘(初始为1!) int len_sum = 1, len_fact = 1; // 数组有效长度
- 迭代计算阶乘并累加
for (int i = 1; i <= n; i++) { // 1. 计算 i!(通过乘法) int carry = 0; for (int j = 0; j < len_fact; j++) { int temp = fact[j] * i + carry; fact[j] = temp % 10; carry = temp / 10; } while (carry > 0) { // 处理剩余进位 fact[len_fact++] = carry % 10; carry /= 10; } // 2. 将 i! 累加到 sum carry = 0; len_sum = max(len_sum, len_fact); for (int j = 0; j < len_sum; j++) { int temp = sum[j] + (j < len_fact ? fact[j] : 0) + carry; sum[j] = temp % 10; carry = temp / 10; } if (carry > 0) sum[len_sum++] = carry; }
- 输出结果
for (int i = len_sum - 1; i >= 0; i--) cout << sum[i];
三、完整代码示例
#include <iostream>
#include <algorithm> // 用于max函数
using namespace std;
const int MAX = 200; // 数组容量(n=50时阶乘约65位)
int main() {
int n;
cin >> n;
int sum[MAX] = {0}, fact[MAX] = {1};
int len_sum = 1, len_fact = 1;
for (int i = 1; i <= n; ++i) {
// 计算i!(保存到fact数组)
int carry = 0;
for (int j = 0; j < len_fact; ++j) {
int temp = fact[j] * i + carry;
fact[j] = temp % 10;
carry = temp / 10;
}
while (carry > 0) {
fact[len_fact++] = carry % 10;
carry /= 10;
}
// 累加至sum数组
carry = 0;
len_sum = max(len_sum, len_fact);
for (int j = 0; j < len_sum; ++j) {
int temp = sum[j] + (j < len_fact ? fact[j] : 0) + carry;
sum[j] = temp % 10;
carry = temp / 10;
}
if (carry > 0) sum[len_sum++] = carry;
}
// 输出结果(逆序打印)
for (int i = len_sum - 1; i >= 0; --i) cout << sum[i];
return 0;
}
四、性能优化方向
优化点 | 实现方式 | 时间复杂度 |
---|---|---|
动态数组长度 | 根据进位动态调整数组长度 | 减少无效循环 |
预分配内存 | 基于n的最大值估算所需位数(如n=50需65位) | 降低内存碎片 |
并行计算 | 多线程分段计算阶乘后合并 | 适合超大规模n(n>1000) |
快速乘法算法 | 采用FFT优化大数乘法 | O(n log n)乘法 |