You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将任意长度uint32_t无符号整型数组转换为十进制字符串表示

实现方案

学习阶段优先实现反复除基取余法,逻辑简单、调试成本低,对于万级十进制位以内的场景性能够用,不需要依赖你已经实现的其他算术运算接口。

核心逻辑

默认你的uint32_t数组按小端存储(即n[0]存最低32位,n[n_length-1]存最高32位,这是绝大多数大数库的存储约定),步骤如下:

  • 先处理边界情况:输入长度为0、全段为0时直接返回"0"
  • 拷贝一份输入数组做运算,避免修改原始输入值
  • 循环对大整数做除以10的运算:
    • 从最高位段开始向最低位遍历,用uint64_t存中间进位值,逐段计算商和余数
    • 单次遍历完成后,最终的余数就是当前大整数的最低位十进制数字
    • 如果最高位段的商为0,就把有效运算长度减1,避免后续无效计算
  • 把每次得到的数字按顺序收集后反转,就是最终的十进制字符串(因为第一次取到的是个位,最后取到的是最高位)

可直接运行的参考实现

#include <string>
#include <algorithm>
#include <cstdint>

std::string uint32_array_to_string(const uint32_t *n, size_t n_length) {
    if (n_length == 0) return "0";

    // 拷贝输入副本,避免修改原数据
    uint32_t* work_buf = new uint32_t[n_length];
    std::copy(n, n + n_length, work_buf);
    size_t valid_seg_cnt = n_length;

    std::string ret;
    // 预分配内存:每32位二进制对应约9.6位十进制,提前留足空间减少扩容开销
    ret.reserve(n_length * 10 + 1);

    while (valid_seg_cnt > 0) {
        uint64_t carry = 0;
        // 从最高位段开始逐段做除以10运算
        for (int i = valid_seg_cnt - 1; i >= 0; --i) {
            uint64_t tmp = (carry << 32) | work_buf[i];
            work_buf[i] = static_cast<uint32_t>(tmp / 10);
            carry = tmp % 10;
        }
        // 本次计算得到的余数就是当前最低位的十进制值
        ret.push_back(static_cast<char>('0' + carry));
        // 最高位段已经除为0,缩减有效长度
        if (work_buf[valid_seg_cnt - 1] == 0) {
            valid_seg_cnt--;
        }
    }

    delete[] work_buf;

    // 原数为0的特殊处理
    if (ret.empty()) return "0";

    // 收集的数字是从个位到最高位的顺序,反转后得到正确结果
    std::reverse(ret.begin(), ret.end());
    return ret;
}

注意事项

  • 如果你的数组是大端存储(n[0]存最高位),只需要把遍历段的顺序反过来,对应调整有效长度的判断逻辑即可
  • 中间计算必须用uint64_t存临时值,否则32位值拼接进位时会出现溢出
  • 不要遗漏全0的边界判断,否则会返回空字符串

后续优化方向

如果后续需要支持十万位以上的超大数,可以按下面的路径优化:

  1. 把单次除10改成除10^9(109=1000000000,小于230,用uint64_t计算不会溢出),每次取余得到9位十进制数,补前导零后拼接,循环次数直接降低为原来的1/9
  2. 百万位以上场景换用二分法转字符串:把大数拆成高低两半,分别转十进制后按位权拼接,时间复杂度可以从O(n²)降到O(n log n)

内容的提问来源于stack exchange,提问作者Mr_IO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 10:15:37