zoukankan      html  css  js  c++  java
  • 大数相加

    (包含小数的大数相加问题)

    求两个超长非负数之和:
      输入为两个非负整数,每个数仅包含0-9的数字、0或1个小数点,长度不大于200
      输出为两数之和。

        //全局变量,判断小数是否向整数进位
        public static boolean isCarry = false;
        
        public static String add(String num1, String num2) {
            //【注】:"."和"|"都是转义字符,必须得加"\"
            String[] number1 = num1.split("\.");
            String[] number2 = num2.split("\.");
            String intDigits1 = number1[0];//num1的整数部分
            String intDigits2 = number2[0];//num2的整数部分
            //num1的小数部分
            String decDigits1 = null;
            if(number1.length > 1)
                decDigits1 = number1[1];
            //num2的小数部分
            String decDigits2 ="";
            if(number2.length > 1)
                decDigits2 = number2[1];
            
            String res = ""; //结果
            //都是整数
            if(decDigits1 == null && decDigits2 == null)
                res = addInt(intDigits1, intDigits2);
            //一个整数一个小数
            else if(decDigits1 != null && decDigits2 == null)
                res = addInt(intDigits1, intDigits2) + "." + decDigits1;
            else if(decDigits1 == null && decDigits2 != null)
                res = addInt(intDigits1, intDigits2) + "." + decDigits2;
            //都是小数
            else if(decDigits1 != null && decDigits2 != null)
                res = addInt(intDigits1, intDigits2) + "." + addDec(decDigits1, decDigits2);
            
            return res;
            
        }
    
    
        /**整数相加*/
        public static String addInt(String num1, String num2) {
            char[] ch1 = num1.toCharArray();
            char[] ch2 = num2.toCharArray();
            
            //利用StringBuilder存结果(逐位相加的数字)
            StringBuilder sb = new StringBuilder();
            
            //数字位从低到高相加,相当于char数组中的数字索引从大到小
            int i = ch1.length - 1;
            int j = ch2.length - 1;
            //进位,初始化为0,如果小数到整数有进位,初始化为1 !!!!!
            int c = 0; 
            if(isCarry)
                c++;
            
            while(i >= 0 || j >= 0) {
                int temp = 0;
                if(i < 0)
                    temp = ch2[j--] - '0' + c;
                if(j < 0)
                    temp = ch1[i--] - '0' + c;
                if(i >= 0 && j >= 0) 
                    temp = ch1[i--] - '0' + ch2[j--] - '0' + c;
                
                //产生进位
                if(temp > 9) {
                    c = 1;
                    temp -= 10;
                }else {
                    c = 0;
                }
                
                sb.append(temp);
            }
            //此时存的是倒序结果,要再反转回来
            return sb.reverse().toString();
        }
        
        /**小数相加*/
        public static String addDec(String num1, String num2) {
            char[] ch1 = num1.toCharArray();
            char[] ch2 = num2.toCharArray();
            //较长数组的第i位开始与短数组的第i位相加,其中i为短数组的最大索引, 相加的和还保存给长数组,最后的长数组就是结果
            char[] maxCh = ch1;
            char[] minCh = ch2;
            if(ch1.length < ch2.length) {
                maxCh = ch2;
                minCh = ch1;
            }
            for(int i = minCh.length - 1; i >= 0; i--) {
                maxCh[i] += minCh[i] - '0';
                if(maxCh[i] > 9) {
                    if(i > 0) {
                        maxCh[i - 1]++;
                        maxCh[i] = 10;
                    }else{
                        //即i==0时,产生小数到整数的进位
                        isCarry = true;
                    }
                }
            }
            return new String(maxCh);
        }
        
  • 相关阅读:
    python第22天作业
    python之常见模块(一)
    python之包和文件目录规范
    python第20天作业
    python之模块
    python之匿名函数
    Python算法之二分法
    间间间间简陋版书城系统
    python第十九天作业
    4-1作业
  • 原文地址:https://www.cnblogs.com/toria/p/11324067.html
Copyright © 2011-2022 走看看