Java语言实现两个超级大数相加
两个超级大数相加
当两个数num1, num2特别大的时候,也就是超级大数,用int, long 明显不足。
在num1 和num2 的长度都小于 5100,不包含任何前导零并且不使用任何內建 BigInteger 库时,可以转换成字符串,逐个字符处理。
Java语言(使用StringBuilder 对象):
public class SuperLargeNumberAddition {
public static String stringAdd(String num1, String num2) {
// 存放结果的 StringBuilder 对象
StringBuilder resultstr = new StringBuilder();
// numlength1, numlength2 表示字符串 num1, num2 的长度. carry 代表进位
int numlength1 = num1.length()-1, numlength2 = num2.length()-1, carry = 0;
int x, y, sum;
// 当 num1,num2 结束 并且不需要进位的时候退出循环
while(numlength1 >= 0 || numlength2 >= 0 || carry != 0) {
// 取字符串的字符减 字符0 即可得到对应数字
x = numlength1 < 0 ? 0 : num1.charAt(numlength1--)-'0';
y = numlength2 < 0 ? 0 : num2.charAt(numlength2--)-'0';
// 计算和
sum = x+y+carry;
// 添加到字符串尾部
resultstr.append(sum%10);
/* 如果插入到s字符串的第一个位置,就不需要使用reverse()
* s.insert(0, sum % 10);
*/
// 更新进位
carry = sum/10;
}
return resultstr.reverse().toString();
}
public static void main(String[] args) {
String str1 = "123456789987654321", str2 = "147258369963852741";
String resultstr = stringAdd(str1, str2);
System.out.println(resultstr);
}
}
/* Code Running Results:
* 270715159951507062
*/
Java语言(使用递归):
public class SuperLargeNumberAdditionTwo {
public static String stringAdd(String num1, String num2) {
return stringAddRecursion(num1, num1.length()-1, num2, num2.length()-1, 0);
}
public static String stringAddRecursion(String num1, int numlength1, String num2, int numlength2, int carry) {
// 参数:numlength1, numlength2 表示字符串 num1, num2 的长度. carry 代表进位
// 当 num1,num2 结束 并且不需要进位的时候返回空字符串
if(numlength1 < 0 && numlength2 < 0 && carry == 0)
return "";
// 取字符串的字符减 字符0 即可得到对应数字
carry += numlength1 < 0 ? 0 : num1.charAt(numlength1--)-'0';
carry += numlength2 < 0 ? 0 : num2.charAt(numlength2--)-'0';
int digit = carry%10;
// 更新进位
carry /= 10;
// 递归
String resultstr = stringAddRecursion(num1, numlength1, num2, numlength2, carry);
return resultstr + digit;
}
public static void main(String[] args) {
String str1 = "123456789987654321", str2 = "147258369963852741";
String resultstr = stringAdd(str1, str2);
System.out.println(resultstr);
}
}
/* Code Running Results:
* 270715159951507062
*/