大数计算

本文介绍了一种通过字符串操作实现的大数加法和减法的方法。该方法能够处理超出常规整数或浮点数范围的数值运算,适用于需要高精度计算的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大数计算

通过对字符串进行操作,实现大数加法和减法。

加法


public static String bigAdd(String a, String b) {
        char[] inta = new StringBuffer(a).reverse().toString().toCharArray();
        char[] intb = new StringBuffer(b).reverse().toString().toCharArray();
        char signa = a.charAt(0) == '-' ? '-' : '+';
        char signb = b.charAt(0) == '-' ? '-' : '+';
        if(signa == signb){
        int lenA = a.length();
        int lenB = b.length();
        int len = (lenA < lenB ? lenB : lenA) + 1;
        char[] intSum = new char[len];

        for (int i = 0, carry = 0; i < len; i++) {
            int aint = i < lenA ? (inta[i] - '0') : 0;
            int bint = i < lenB ? (intb[i] - '0') : 0;
            int sum = aint + bint + carry;
            if (sum >= 10) {
                intSum[i] = (char) (sum - 10 + '0');
                carry = 1;
            } else {
                intSum[i] = (char) (sum + '0');
                carry = 0;
            }
        }

        StringBuffer sum = new StringBuffer(new String(intSum));
        if (sum.charAt(sum.length() - 1) == '0') {
            sum.deleteCharAt(sum.length() - 1);
        }

        if (sum.charAt(sum.length() - 1) == '*') {
            sum.deleteCharAt(sum.length() - 1);
            sum.append('-');
        }
        return sum.reverse().toString();
        }else if(signa == '-'){
            a = new StringBuffer(a).deleteCharAt(0).toString();
            return bigSubtract(b, a);
        }else{
            b = new StringBuffer(b).deleteCharAt(0).toString();
            return bigSubtract(a, b);
        }

    }

减法

public static String bigSubtract(String a, String b) {
        char[] inta = new StringBuffer(a).reverse().toString().toCharArray();
        char[] intb = new StringBuffer(b).reverse().toString().toCharArray();
        char signa = a.charAt(0) == '-' ? '-' : '+';
        char signb = b.charAt(0) == '-' ? '-' : '+';
        //符号相同则进行减法,否则进行加法
        if (signa == signb) {
            // 减法
            int lenA = inta.length;
            int lenB = intb.length;
            int len = lenA < lenB ? lenB : lenA;
            char[] intSum = new char[len];
            char signSum = '+';
            if (lenA < lenB) {
                signSum = '-';
            } else if (lenA == lenB) {
                int i = lenB - 1;
                while(i > 0 && inta[i] == intb[i]){
                    i--;
                }
                if (inta[i] < intb[i]) {
                    signSum = '-';
                }
            }

            //减法计算
            for (int i = 0; i < len; i++) {
                int aint = (i < lenA ? inta[i] - '0' : 0);
                int bint = i < lenB ? intb[i] - '0' : 0;
                if (signSum == '+') {
                    intSum[i] = (char) (aint - bint + '0');
                } else {
                    intSum[i] = (char) (bint - aint + '0');
                }
            }

            //若某位为负,则进行借位操作 
            for(int i = 0;i<len-1;i++){
                if(intSum[i]<'0'){
                    intSum[i] += 10;
                    intSum[i+1]--;
                }
            }
            StringBuffer sb = new StringBuffer(new String(intSum));
            //去除前面的0
            for(int i = len-1;i>=0;){
                if(sb.charAt(len-1)=='0'){
                    sb.deleteCharAt((len--)-1);
                }else{
                    i = -1;
                }
            }

            //添加负号
            if (signSum == '-') {
                sb.append('-');
            }

            return sb.reverse().toString();
        }
        if (signa == '-') {
            a = new StringBuffer(a).deleteCharAt(0).toString();
            return "-" + bigAdd(a, b);
        } else {
            b = new StringBuffer(b).deleteCharAt(0).toString();
            return bigAdd(a, b);
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值