刚参加了个面试,有个上机算法题目,java 中大整数字符串的加法,很早就碰到过类似的题目,一直没有静下心想过,这次面试开始还在想是不是干脆使用Bigdecimal类,但是上机没有api文档,不知道bigdecimal是怎么拼的(⊙﹏⊙b汗),还是仔细的想了下,最后完成如下:
public class BigNumAdd {
public static void main(String[] args){
System.out.println(add("987654321","123456789"));
}
/**
* 高位补足0,使得两个数字长度相同
* @param num
* @return
*/
public static String createZero(int num){
StringBuilder sb = new StringBuilder("");
for(int i = 0; i < num ; i++){
sb.append("0");
}
return sb.toString();
}
/**
* 大字符串数字加法
* @param data1
* @param data2
* @return
*/
public static String add(String data1 , String data2){
int len1 = data1.length();
int len2 = data2.length();
int num = len1 > len2 ? len1 - len2 : len2 - len1 ; //计算两个数相差的位数
if(len1 > len2){
data2 = createZero(num) + data2 ;
}else{
data1 = createZero(num) + data1 ;
}
char[] char1 = data1.toCharArray();
char[] char2 = data2.toCharArray();
int[] result = add(char1,char2); //一位一位相加拼成结果
StringBuilder sb = new StringBuilder("");
for(int i = 0; i < result.length ; i++){
if(result[i] == 0 && i == 0){
sb.append("");
}else{
sb.append(result[i]);
}
}
return sb.toString();
}
/**
* 位数相同的整数加法
*/
public static int[] add(char[] char1 , char[] char2){
int[] result = new int[char1.length + 1]; //相加后最多向上进1位
int shiweiNum = 0; //每位相加后的十位数字
int len = char1.length;
for(int i = len - 1 , j = i + 1; i >= 0 ; i--,j--){
int num1 = Integer.parseInt(char1[i]+"");
int num2 = Integer.parseInt(char2[i]+"");
int count = num1 + num2 + shiweiNum;
result[j] = count % 10;
shiweiNum = count / 10;
}
return result;
}
}