C++高精度计算实现思路

一、核心算法原理

  1. 数据结构选择

    使用整型数组存储大数,每位数字用数组元素表示(逆序存储便于进位处理)

    • 示例:数字120存储为[0, 2, 1](数组索引0对应个位)

     

  2. 基本运算规则

    • 加法/乘法‌:逐位运算后处理进位
    • 阶乘计算‌:迭代乘法(i! = (i-1)! × i)并动态扩展数组长度
    • 累加求和‌:依次将每个阶乘结果加入总和数组中

二、关键实现步骤

问题场景:计算 1!+2!+…+n!(n≤50)

  1. 初始化数组
    int sum[MAX] = {0};    // 存储总和
    int fact[MAX] = {1};   // 存储当前阶乘(初始为1!)
    int len_sum = 1, len_fact = 1;  // 数组有效长度
  2. 迭代计算阶乘并累加
    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;
    }
  3. 输出结果
    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)乘法
posted @ 2025-05-12 15:57  洛弗尔  阅读(79)  评论(0)    收藏  举报