大数字符串的四则运算之加法----Java代码实现

大数相加

具体实现步骤
1. 如果两个数同号,则记录符号为,对除符号为以为的数进行相加计算;
2. 如果两个数异号,则比较个数大小,记录较大数的符号位为和的符号位,然后对除符号为以为的数进行相减计算;

两个大正整数的加法实现思想
1. 从两个字符串的尾部(即最后一个字符)开始,逐个个字符相加并加上进位标志位tag,如果和大于9,将进位标志位tag=1,否则为tag=0,并将和的个位保存到最终数组中;
2. 循环,直到两个数全部遍历完;
3. 图解除符号为之外的两个大数相加思想
4. 这里写图片描述

Java代码实现

/**
     * 两个正大数相加
     * @param num1
     * @param num2
     * @param isPositive  结果正负标志位
     * 
     */
    public static  StringBuffer addPositionNum(String num1,String num2, boolean isPositive) {
         int i = num1.length() - 1;
         int j = num2.length() - 1;
         int tag = 0;  //进位; 1有进位,0无进位
         int sum;      //计算整数和
         //注意new StringBuffer(" ")必须存入一位空格,以便不断插入所计算的和
         StringBuffer str = new StringBuffer(" ");
         while (i >= 0 && j >= 0) {
            sum = (num1.charAt(i) - '0') + (num2.charAt(j)-'0') + tag;
            if (sum > 9) {
                tag = 1;
                sum = sum % 10;
            }else {
                tag = 0;
            }
            str.insert(1, sum);
            i--;j--;
        }

         while (i >= 0) {
             if (tag > 0) {  //说明地位有进位
                 sum = (num1.charAt(i)-'0')+tag;
                 if (sum > 9) {
                    tag = 1;
                    sum = sum % 10;
                }else {
                    tag = 0;
                }

                str.insert(1, sum);
                i--;
            }else {
                sum = num1.charAt(i)-'0';
                str.insert(1, sum);
                i--;
            }
        }

        while (j >= 0) {
            if (tag > 0) {
                sum = num2.charAt(j)-'0'+tag;
                if (sum > 9) {
                    tag = 1;
                    sum = sum % 10;
                }else{
                    tag = 0;
                }
                str.insert(1, sum);
                j--;
            }else {
                sum = num2.charAt(j)-'0';
                str.insert(1, sum);
                j--;
            }
        }

        //如果最高位有进位,则在最高位加入1
        if (tag == 1) {
            str.insert(1, 1);
        }

        if (!isPositive) {
            str.insert(1, "-");
        }

        System.out.println("add"+str);
        return str;
    }

以上方法实现了两个大正数的相加,下面我们继续看看大正数相减,因为计算两个有符号数相加会用到相减的方法;
除符号位外的两个大正数相减运算思想
看图应该比较明白一点
这里写图片描述
Java代码实现

/**
     * 两个正数相减
     * @param num1
     * @param num2
     * @param isPositive
     */
    public static StringBuffer subPositiveNum(String num1,String num2, boolean isPositive) {    
            int tag = 0;
            int sub = 0;
            StringBuffer str = new StringBuffer(" ");
            if (num1.length() < num2.length() || num1.compareTo(num2) < 0) {
                String temp = num1;
                num1 = num2;
                num2 = temp;    
            }
            int i = num1.length()-1;
            int j = num2.length()-1;
            while (i >= 0 && j >= 0) {
                sub = (num1.charAt(i) - '0')-(num2.charAt(j)-'0')+tag;
                if (sub < 0) {
                    tag = -1;
                    sub = 10 + sub; 
                }else {
                    tag = 0;
                }
                str.insert(1, sub);
                i--;j--;
            }

            while (i >= 0) {
                if (tag < 0) {
                    sub = (num1.charAt(i) - '0')+tag;
                    if (sub < 0) {
                        tag = -1;
                        sub = sub + 10;
                    }else {
                        tag = 0;
                    }
                    str.insert(1, sub);
                    i--;
                } else {
                    sub = num1.charAt(i) - '0';
                    str.insert(1, sub);
                    i--;
                }
            }
            if (!isPositive) {
                str.insert(1, '-');
            }

            System.out.println("sub"+str);
            return str;
    }

基本工作做完了,接下来实现两个字符串大数的相加
Java代码的实现

    public static void add(String num1,String num2){
        if (num1.length() <= 0 && num2.length() <= 0) return;
        boolean isPositive = true;
        StringBuffer result = new StringBuffer();
        if (num1.charAt(0) == '-'&&num2.charAt(0) == '-') {
            //两个负数相加;去掉符号
            result = addPositionNum(num1.substring(1), num2.substring(1), false);
        }else if(num1.charAt(0) != '-'&&num2.charAt(0) != '-'){
            //两个正数相加
            result = addPositionNum(num1, num2, true);
        }else if(num1.charAt(0) == '-'){
            //两个数异号,做减法运算
            num1 = num1.substring(1);
            //确定计算后的正负
            if (num1.compareTo(num2) >= 0) {
                isPositive = false;
            }else {
                isPositive = true;
            }
            result = subPositiveNum(num1, num2, isPositive);
        }else if (num2.charAt(0) == '-') {
            num2 = num2.substring(1);
            if (num2.compareTo(num1)  >= 0) {
                isPositive = false;
            }else {
                isPositive = true;
            }
            result = subPositiveNum(num1, num2, isPositive);
        }
        System.out.println("两个数相加的结果:"+result);
    }

因为相减和相加都需要用到上面说的方法,那么这里给出相减的方法;

public static void subtract(String num1,String num2) {
            boolean isPositive = true;
            StringBuffer result = new StringBuffer();
            if (num1.charAt(0) == '-' && num2.charAt(0) == '-') {
                //两个数都为负
                if (num1.compareTo(num2) > 0) 
                    isPositive = false;
                result = subPositiveNum(num1.substring(1), num2.substring(1), isPositive);
            }else if(num1.charAt(0) != '-' && num2.charAt(0) != '-'){
                if (num1.compareTo(num2) < 0) 
                    isPositive = false;
                result = subPositiveNum(num1, num2, isPositive);
            }else if(num1.charAt(0) == '-'){
                isPositive = false;
                result = addPositionNum(num1.substring(1), num2, isPositive);
            }else if(num2.charAt(0) == '-'){
                result = addPositionNum(num1, num2.substring(1), isPositive);
            }
            System.out.println("两个数相减的结果:"+result);
    }

最后给出Java自带的大数计算类,以便大家验证

    //自带类库实现大数相乘
    public static  void bigNumMultiply(String str1,String str2) {
          BigInteger a = new BigInteger(str1);
          BigInteger b = new BigInteger(str2);
          System.out.println("两个大数的运算结果为");
          BigInteger c = a.add(b);
          BigInteger d = a.subtract(b);
          BigInteger e = a.multiply(b);
          BigInteger f = a.divide(b);
          BigInteger g = a.remainder(b);
          System.out.println("加"+ c);
          System.out.println("减"+ d);
          System.out.println("乘"+ e);
          System.out.println("除"+ f);
          System.out.println("取余"+ g);
    }

这里给出另一种计算两个大整数相加的方法,以便参考和记录学习;

    /**
     * 高精度加法函数
     */
    public static int[] add(char[] ch1,char[] ch2,int len1,int len2) {
        //两个数同号,则直接相加       
        int len = len1>=len2 ? len1+1 : len2+1;
        int[] result = new int[len];   //存放结果
        int i = ch1.length -1,j = ch2.length -1,k = len-1;
        while(i >= 0 && j >= 0){   //如果两个数都在界内,则进行加法运算
            int n1 = Integer.valueOf(String.valueOf(ch1[i]));
            int n2 = Integer.valueOf(String.valueOf(ch2[j]));
            result[k] = n1 + n2;
            i--;j--;k--;
        }

        while(i >= 0){
            int n1 = Integer.valueOf(String.valueOf(ch1[i]));
            result[k] = n1;
            i--;k--;
        }
        while(j >= 0){
            int n2 = Integer.valueOf(String.valueOf(ch2[j]));
            result[k] = n2;
            j--;k--;
        }

        //进位修补
        for (int m = len-1; m > 0; m--) {
            if (result[m] > 9) {
                result[m-1]  = result[m]/10+result[m-1] ;
                result[m] = result[m]%10;
            }   
        }

        //两个数异号,则比较大小,做减法运算
        return result;
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值