两个长整数相加

无论你面试的是什么岗位,应该都或多或少看到过这个问题 - 两个长整数相加(两数均为正整数)要怎么实现。如果a和b的位数不大,确实直接用类型转换就可以求出a+b了,但是万一a和b的位数都是几百位呢,早就溢出了,这时候要怎么计算呢?

这种情况下,有三种解决方法可供选择:

  一、 用字符串来存储a和b的值;

  二、 用数组来存储a和b的值;

       三、 用StringBuffer按位存储;

  四、 用链表来存储a和b的值。  

这四种方法都有一个共同点,就是无论哪一种方法,都可以不用担心因为数字太大而造成数值溢出出错。其实原理差不多,即拆分成字符,然后遍历两个字符串。我们使用数组存储的方式实现。

代码实现:

package com.lzy;

import java.util.Scanner;

public class AddLongInteger {
    public static void main(String[] args) {
        //使用Scanner,获取连续两次输入
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String addend = scanner.nextLine();
            String aguend = scanner.nextLine();
            System.out.println(AddTwoNums(addend,aguend));
        }
    }
    /**
     * 输入参数:
     * String addend:加数
     * String augend:被加数
     * 返回值:加法结果
     */
   public static String AddTwoNums(String addend, String aguend){
        //字符串拆分放进数组
        char[] a1 = addend.toCharArray();
        char[] a2 = aguend.toCharArray();
        
        //结果数的长度是最长字符串长度+1,因为可能存在进位的情况
        int resultLength = a1.length>a2.length?a1.length+1:a2.length+1;

        //初始化结果数组c
        char[] r = new char[resultLength];
        for(int i=0; i<resultLength; i++){
            r[i]='0';
        }
        //翻转a1,a2,便于从头相加
        char[] b1 = new char[a1.length];
        char[] b2 = new char[a2.length];
        for(int i=0; i<a1.length; i++){
            b1[i] = a1[a1.length-1-i];
        }
        for(int i=0;i<a2.length; i++){
            b2[i] = a2[a2.length-1-i];
        }
        //执行相加
        for(int i=0; i<resultLength-1; i++){
            int count = 0;
            if(b1.length-1-i >=0 && b2.length-1-i>=0){
                count = b1[i]-'0'+b2[i]-'0';//此处 -'0'和下边+'0',是使用ASCII码表中数字相加减原理,免去类型转换
            }else if(b1.length-1-i >=0 && b2.length-1-i<0){
                count = b1[i]-'0';
            }else if(b1.length-1-i <0 && b2.length-1-i>=0){
                count = b2[i]-'0';
            }
            int value = r[i] - '0' + count;
            r[i] = (char)(value%10 + '0');
            r[i+1] += value/10;
        }
        //判断最后一位是否为0
        while(r[resultLength-1] == '0'){
            resultLength --;
        }
        //将结果翻转
        char r2[] = new char[resultLength];
        for(int i=0; i<resultLength; i++){
            r2[resultLength-1-i] = r[i];
        }
        String result = new String(r2);
        return result;
    }
}

每天一道算法题,成就更好的自己!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章