public class 大数相加 {
public static String add(String n1, String n2){
StringBuilder result = new StringBuilder();
// 反转字符串
String rn1 = new StringBuilder(n1).reverse().toString();
String rn2 = new StringBuilder(n2).reverse().toString();
int len1 = rn1.length();
int len2 = rn2.length();
int maxLen = len1 > len2 ? len1 : len2;
boolean nOverFlow = false;// 是否越界
int nTakeOver = 0;// 溢出数量
// 把两个字符串补齐,即短字符串的高位用0补齐
if(len1 < len2){
for(int i = len1; i < len2; i++){
rn1 += "0";
}
}else{
for(int i = len2; i < len1; i++){
rn2 += "0";
}
}
// 把两个正整数相加,一位一位的加 并加上进位
for(int i = 0; i < maxLen; i++){
int nSum = (rn1.charAt(i)-'0') + (rn2.charAt(i)-'0');
nSum = nSum + nTakeOver;// 加上前一位的进位
if(nSum >= 10){
if(i == maxLen - 1){// 已经计算到最后一位了
nOverFlow = true;
}
nTakeOver = 1;//溢出了
result.append(nSum - 10);
}else{
nTakeOver = 0;// 没溢出
result.append(nSum);
}
}
// 如果溢出的话 表示位增加了
if(nOverFlow){
result.append(nTakeOver);
}
return result.reverse().toString();
}
public static String reduce(String str1,String str2){
StringBuilder sb=new StringBuilder();
if(str1==null ||str2==null){
return sb.toString();
}
String s1=new StringBuilder(str1).reverse().toString();
String s2=new StringBuilder(str2).reverse().toString();
int len1=s1.length();
int len2=s2.length();
int max=len1>len2?len1:len2;
if(len1>len2){
for(int i=len2;i<max;i++){
s2+="0";
}
}else{
for(int i=len1;i<max;i++){
s1+="0";
}
}
int over=0;
for(int i=0;i<max;i++){
int sum=0;
if(len1>len2){
sum=s1.charAt(i)-'0'-(s2.charAt(i)-'0');
sum+=over;
}else{
sum=s2.charAt(i)-'0'-(s1.charAt(i)-'0');
sum+=over;
}
if(sum<0){
over=-1;
sb.append(10+sum);
}else{
over=0;
sb.append(sum);
}
}
return sb.reverse().toString();
}
public static void main(String[] args){
String n1 = "999999999";
String n2 = "9999999999";
System.out.println(add(n1, n2));
System.out.println(reduce(n1, n2));
}
}