无论你面试的是什么岗位,应该都或多或少看到过这个问题 - 两个长整数相加(两数均为正整数)要怎么实现。如果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;
}
}
每天一道算法题,成就更好的自己!