用字符串模拟两个大数相加
程序员文章站
2022-03-25 16:29:42
...
package cn.com.hadoop;
/**
* 用字符串模拟两个大数相加,计算机中整型数据都是有范围的,不能无限大;突然想到了小学时候的列竖式进行笔算
* @author gaojingsong
*/
public class Demo {
/** 1897
思路: + 56
1.对齐两个字符串,即短字符串的高位用‘0’补齐,便于后面的相加;(1897,0056)
2.反转两个字符串,便于从低位到高位相加和最高位的进位导致和的位数增加;(7981,,65 00)
3.把两个正整数相加,一位一位的加并加上进位。
(7+6=13 9+5+进位1=15 8+0+进位1=9 1+0=1)
3 5 9 1 因此结1953
*/
public static void main(String[] args) {
add("991","23");
add("1897","56");
//java.math.BigInteger a2 = new java.math.BigInteger(a);
}
/**
* 1、取得两个字符串的长度,把长度较短的字符串,在左面补0,使之与较长字符串一样长
* 2、长度相同反转字符串,从个位开始进行累加,字符串每位取出来相加,
如果大于10则进位,结果位为相加和减去10
* @param n1
* @param n2
* @return
*/
public static String add(String n1, String n2) {
StringBuffer result = new StringBuffer();
// 一、反转
StringBuffer num1 = new StringBuffer(n1).reverse();
StringBuffer num2 = new StringBuffer(n2).reverse();
// 二、补齐,把两个字符串补齐,即短字符串(反转后短字符串的最低位)的高位用0补齐,
int len1 = num1.length();
int len2 = num2.length();
int maxlength = len1 > len2 ? len1 : len2;
if (len1 > len2) {
for (int i = len2; i < len1; i++) {
num2.append(0);
}
} else if (len1 < len2) {
for (int i = len1; i < len2; i++) {
num1.append(0);
}
}
// 三、逐位相加,把两个正整数相加,一位一位的加并加上进位
int overNum = 0; //溢出数量,个位数相加最多进一位
boolean hinghtLocOverFlow = false;//是否越界
for (int i = 0; i < maxlength; i++) {
int num3 = overNum
+ Integer.parseInt(String.valueOf(num1.charAt(i) + ""))
+ Integer.parseInt(String.valueOf(num2.charAt(i) + ""));
if (num3 >= 10) {
result.append(num3 - 10);
overNum = 1;//每位相加满十则进一
//判断最后一位是否会溢出满10,满十则进一位
if (i == maxlength-1) {
hinghtLocOverFlow = true;
}
} else {
overNum = 0;
result.append(num3);
}
//如果溢出的话表示位增加了
if (hinghtLocOverFlow) {
result = result.append(1);
}
}
String res = result.reverse().toString();
System.out.println(res);
return res;
}
}
/**
* 用字符串模拟两个大数相加,计算机中整型数据都是有范围的,不能无限大;突然想到了小学时候的列竖式进行笔算
* @author gaojingsong
*/
public class Demo {
/** 1897
思路: + 56
1.对齐两个字符串,即短字符串的高位用‘0’补齐,便于后面的相加;(1897,0056)
2.反转两个字符串,便于从低位到高位相加和最高位的进位导致和的位数增加;(7981,,65 00)
3.把两个正整数相加,一位一位的加并加上进位。
(7+6=13 9+5+进位1=15 8+0+进位1=9 1+0=1)
3 5 9 1 因此结1953
*/
public static void main(String[] args) {
add("991","23");
add("1897","56");
//java.math.BigInteger a2 = new java.math.BigInteger(a);
}
/**
* 1、取得两个字符串的长度,把长度较短的字符串,在左面补0,使之与较长字符串一样长
* 2、长度相同反转字符串,从个位开始进行累加,字符串每位取出来相加,
如果大于10则进位,结果位为相加和减去10
* @param n1
* @param n2
* @return
*/
public static String add(String n1, String n2) {
StringBuffer result = new StringBuffer();
// 一、反转
StringBuffer num1 = new StringBuffer(n1).reverse();
StringBuffer num2 = new StringBuffer(n2).reverse();
// 二、补齐,把两个字符串补齐,即短字符串(反转后短字符串的最低位)的高位用0补齐,
int len1 = num1.length();
int len2 = num2.length();
int maxlength = len1 > len2 ? len1 : len2;
if (len1 > len2) {
for (int i = len2; i < len1; i++) {
num2.append(0);
}
} else if (len1 < len2) {
for (int i = len1; i < len2; i++) {
num1.append(0);
}
}
// 三、逐位相加,把两个正整数相加,一位一位的加并加上进位
int overNum = 0; //溢出数量,个位数相加最多进一位
boolean hinghtLocOverFlow = false;//是否越界
for (int i = 0; i < maxlength; i++) {
int num3 = overNum
+ Integer.parseInt(String.valueOf(num1.charAt(i) + ""))
+ Integer.parseInt(String.valueOf(num2.charAt(i) + ""));
if (num3 >= 10) {
result.append(num3 - 10);
overNum = 1;//每位相加满十则进一
//判断最后一位是否会溢出满10,满十则进一位
if (i == maxlength-1) {
hinghtLocOverFlow = true;
}
} else {
overNum = 0;
result.append(num3);
}
//如果溢出的话表示位增加了
if (hinghtLocOverFlow) {
result = result.append(1);
}
}
String res = result.reverse().toString();
System.out.println(res);
return res;
}
}
上一篇: DSA_07:递归算法
推荐阅读
-
Object-C 栈的应用实现两个大数相加
-
【String-easy】415. Add Strings两个字符串对应位置相加(大数相加)
-
用javascript求两个字符串最大的相同的子串(代码实例)
-
JS实现的用来对比两个用指定分隔符分割的字符串是否相同_javascript技巧
-
JS实现的用来对比两个用指定分隔符分割的字符串是否相同_javascript技巧
-
编写一个Java应用程序,从键盘读取用户输入两个字符串,并重载3个函数分别实现这两个字符串的拼接、整数相加和浮点数相加。要进行异常处理,对输入的不符合要求的字符串提示给用户,不能使程序崩溃。
-
用javascript求两个字符串最大的相同的子串(代码实例)
-
用字符串模拟两个大数相加
-
怎么用python让两个小数相加
-
算法例子:两个大数字符串相加(java)