题解 | #高精度整数加法#

高精度整数加法

http://www.nowcoder.com/practice/49e772ab08994a96980f9618892e55b6

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str1 = null;
        String str2 = null;
        String str3 = null;
        StringBuffer strb = new StringBuffer();
        int sum = 0;
        int sp = 0;//溢出寄存器

        while (in.hasNext()) {
            str1 = in.nextLine();
            str2 = in.nextLine();
            sp = 0;
            if (str1.length() < str2.length()) {//确保第一个字符串更长
                str3 = str1;
                str1 = str2;
                str2 = str3;
            }
            char[] char1 = str1.toCharArray();
            char[] char2 = str2.toCharArray();
            //System.out.println("str1.length() = " + str1.length());
            int[] int1 = new int[char1.length + 1];
            int[] int2 = new int[char1.length + 1];
            int[] int3 = new int[char1.length + 1];
            for (int i = 1; i <= char1.length; i++) {//获取int数组
                int1[i] = char1[i - 1]-48;//char是Ascii码,比数值大48
                if (i < char2.length + 1) {
                    int2[i + char1.length - char2.length] = char2[i - 1]-48;
                    //char是Ascii码,比数值大48
                }
            }
            for (int i = int1.length - 1; i >= 0; i--) {//按位累加
                //System.out.println("i = " + i);
                //System.out.println("int1[i] = " + int1[i]);
                //System.out.println("int2[i] = " + int2[i]);
                sum = int1[i] + int2[i] + sp;
                if (sum > 9) {
                    sp = 1;
                    int3[i] = sum - 10;
                    //System.out.println("int3["+i+"] = " + int3[i]);
                } else {
                    sp = 0;
                    int3[i] = sum;
                    //System.out.println("int3["+i+"] = " + int3[i]);
                }

            }
            for (int i = 0; i < int3.length; i++) {
                strb.append(int3[i]);
            }
            //System.out.println("strb.charAt(0) = " + strb.charAt(0));
            if (strb.charAt(0)==48){//Ascii码的0值为48
            //if (strb.charAt(0)=='0'){//Ascii码的0值为48
                //System.out.println("strb.charAt(0) = " + strb.charAt(0));
                strb.delete(0,1);
            }

            System.out.println(strb);
            strb.delete(0,strb.length());


        }
    }
}

先上代码。由于需要的是不丢失精度的整数加法,当然是不能用浮点数的加法来做。所以笔者采用了逐位相加的方式。和单片机的溢出寄存器一样,定义一个sp做溢出标记,下次需要+1进位。

中规中矩的做法,先获取输入的2个字符串,为了方便后续编程,先排序,就可以根据更长的字符串的位数+1来新建字符串,避免位数不够导致的溢出。之后就是逐位遍历,把字符数组的每一位放到int数组中。此处要注意,char数组的内容是Ascii码表示的数字,并不能直接转换为数字('0'=48,'1'=49,比正常数字大48),需要-48。笔者在此处踩了个坑,一直算不对。后边也是,追加后的stringbuffer实例对象strb的第0位也是'0'。。。

最后还得注意,如果首位是0,应该舍弃。

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务