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

如何在Python中存储无符号1024位整数并实现加法函数

实现1024位无符号大整数加法方案

核心思路

用低位在前的long数组存储大整数:1024位正好是16个64位无符号long(1024 / 64 = 16),低位存在数组下标0,高位依次往后。这种存储方式和手动加法的顺序一致,方便处理进位。


MyBigInteger类实现

public class MyBigInteger {
    // 存储无符号64位整数,低位在前,高位在后
    private final long[] digits;

    // 构造方法:传入long数组(低位在前),自动去除末尾冗余0
    public MyBigInteger(long[] digits) {
        int nonZeroEnd = digits.length - 1;
        // 跳过末尾的0,减少无效存储
        while (nonZeroEnd >= 0 && digits[nonZeroEnd] == 0) {
            nonZeroEnd--;
        }
        // 处理全0的情况
        if (nonZeroEnd < 0) {
            this.digits = new long[]{0};
        } else {
            this.digits = new long[nonZeroEnd + 1];
            System.arraycopy(digits, 0, this.digits, 0, nonZeroEnd + 1);
        }
    }

    // 获取内部数组的副本(避免外部修改)
    public long[] getDigits() {
        return digits.clone();
    }

    // 静态加法方法:实现两个无符号大整数相加
    public static MyBigInteger add(MyBigInteger a, MyBigInteger b) {
        long[] aDigits = a.digits;
        long[] bDigits = b.digits;
        int maxLength = Math.max(aDigits.length, bDigits.length);
        // 结果数组预留一位,处理最高位进位
        long[] result = new long[maxLength + 1];
        long carry = 0;

        for (int i = 0; i < maxLength; i++) {
            // 取出当前位的数,超出数组范围则取0
            long x = i < aDigits.length ? aDigits[i] : 0;
            long y = i < bDigits.length ? bDigits[i] : 0;

            // 计算x+y的无符号和与进位
            long total = x + y;
            // 无符号溢出判断:若x+y溢出有符号long,结果会是负数,小于x(x为无符号正数)
            long carry1 = total < x ? 1 : 0;

            // 加上之前的进位,再计算新的进位
            total += carry;
            long carry2 = total < carry ? 1 : 0;
            carry = carry1 + carry2;

            // 保存当前位结果(无符号低64位)
            result[i] = total;
        }

        // 处理最高位的剩余进位
        if (carry != 0) {
            result[maxLength] = carry;
        }

        return new MyBigInteger(result);
    }

    // 可选:重写toString,以十六进制打印(高位在前)
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("MyBigInteger[");
        // 从高位到低位打印
        for (int i = digits.length - 1; i >= 0; i--) {
            sb.append(Long.toUnsignedString(digits[i], 16));
            if (i > 0) sb.append(", ");
        }
        sb.append("]");
        return sb.toString();
    }
}

关键细节说明

  1. 存储顺序:低位在前是核心,这样加法从数组下标0开始,和手动加个位、十位的逻辑完全匹配,进位直接传递到下一个下标,无需反向遍历。
  2. 无符号进位处理:Java的long是有符号类型,但无符号加法的低64位结果和有符号加法一致。通过total < x判断溢出(溢出后结果为负数,必然小于正数x),就能得到无符号加法的进位。
  3. 冗余0处理:构造方法自动去除数组末尾的0,避免结果出现无效的空元素,同时处理全0的边界情况。

测试示例

public class Main {
    public static void main(String[] args) {
        // 测试:第一个数是最低位为全1的1024位数,第二个数是1
        long[] aDigits = new long[16];
        aDigits[0] = 0xFFFFFFFFFFFFFFFFL; // 64位全1的无符号数
        long[] bDigits = new long[16];
        bDigits[0] = 1;

        MyBigInteger a = new MyBigInteger(aDigits);
        MyBigInteger b = new MyBigInteger(bDigits);
        MyBigInteger sum = MyBigInteger.add(a, b);

        System.out.println("a: " + a);
        System.out.println("b: " + b);
        System.out.println("sum: " + sum);
        // 输出结果的最低位为0,第二位为1,其余为0,符合预期
    }
}

新手拓展提示

  • 如果需要支持从十进制/十六进制字符串构造MyBigInteger,可以实现字符串到long数组的转换逻辑(核心是逐段解析字符串为无符号long)。
  • 无符号大整数的减法、乘法等操作,都可以基于类似的数组遍历+进位/借位逻辑实现,注意无符号的边界判断(比如用Long.compareUnsigned做无符号比较)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:15:41