package jzOffer.practice;
import java.math.BigInteger;
public class BigShuAddAndMulti {
public static String bigNumberAdd(String f, String s) {
// 翻转两个字符串,并转换成数组
char[] a = new StringBuffer(f).reverse().toString().toCharArray();
char[] b = new StringBuffer(s).reverse().toString().toCharArray();
int lenA = a.length;
int lenB = b.length;
// 计算两个长字符串中的较长字符串的长度
int len = lenA > lenB ? lenA : lenB;
int[] result = new int[len + 1];
for (int i = 0; i < len + 1; i++) {
// 如果当前的i超过了其中的一个,就用0代替,和另一个字符数组中的数字相加
int aint = i < lenA ? (a[i] - '0') : 0;
int bint = i < lenB ? (b[i] - '0') : 0;
result[i] = aint + bint;
}
// 处理结果集合,如果大于10的就向前一位进位,本身进行除10取余
for (int i = 0; i < result.length; i++) {
if (result[i] > 10) {
result[i + 1] += 1;
result[i] %= 10;
}
}
StringBuffer sb = new StringBuffer();
// 该字段用于标识是否有前置0,如果有就不要存储
boolean flag = true;
for (int i = len; i >= 0; i--) {
if (result[i] == 0 && flag) {
continue;
} else {
flag = false;
}
sb.append(result[i]);
}
return sb.toString();
}
public static String bigNumberSimpleMulti(String f, String s) {
// 获取首字符,判断是否是符号位
char signA = f.charAt(0);
char signB = s.charAt(0);
char sign = '+';
if (signA == '+' || signA == '-') {
sign = signA;
f = f.substring(1);
}
if (signB == '+' || signB == '-') {
if (sign == signB) {
sign = '+';
} else {
sign = '-';
}
s = s.substring(1);
}
// 将大数翻转并转换成字符数组
char[] a = new StringBuffer(f).reverse().toString().toCharArray();
char[] b = new StringBuffer(s).reverse().toString().toCharArray();
int lenA = a.length;
int lenB = b.length;
// 计算最终的最大长度
int len = lenA + lenB;
int[] result = new int[len];
// 计算结果集合
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
result[i + j] += (int) (a[i] - '0') * (int) (b[j] - '0');
}
}
// 处理结果集合,如果是大于10的就向前一位进位,本身进行除10取余
for (int i = 0; i < result.length; i++) {
if (result[i] > 10) {
result[i + 1] += result[i] / 10;
result[i] %= 10;
}
}
StringBuffer sb = new StringBuffer();
// 该字段用于标识是否有前置0,如果是0就不需要打印或者存储下来
boolean flag = true;
for (int i = len - 1; i >= 0; i--) {
if (result[i] == 0 && flag) {
continue;
} else {
flag = false;
}
sb.append(result[i]);
}
if (!sb.toString().equals("")) {
if (sign == '-') {
sb.insert(0, sign);
}
} else {
sb.append(0);
}
// 返回最终结果
return sb.toString();
}
public static void main(String[] args) {
String n1 = "469552298526666";
String n2 = "97666223339696969";
String n = bigNumberAdd(n1, n2);
System.out.println(n);
// 用BigInteger类验证
BigInteger b1 = new BigInteger(n1);
BigInteger b2 = new BigInteger(n2);
System.out.println(b1.add(b2));
String n3 = "469552298526666";
String n4 = "97666223339696969";
String n5 = bigNumberSimpleMulti(n3, n4);
System.out.println(n5);
// 用BigInteger类验证
BigInteger b3 = new BigInteger(n1);
BigInteger b4 = new BigInteger(n2);
System.out.println(b3.multiply(b4));
}
//另一种写法
public static String add(String str1, String str2) {
if(str1 == null)
return str2;
if(str2 == null)
return str1;
StringBuffer s1 = new StringBuffer(str1).reverse();
StringBuffer s2 = new StringBuffer(str2).reverse();
StringBuffer res = new StringBuffer();
int len1 = s1.length();
int len2 = s2.length();
int len;
if(len1 < len2) {
len = len2;
int count = len2 - len1;
while(count-- > 0)
s1.append('0');
} else {
len = len1;
int count = len1 - len2;
while(count-- > 0)
s2.append('0');
}
int overflow = 0;
int num;
for(int i = 0; i < len; i++) {
num = s1.charAt(i) - '0' + s2.charAt(i) - '0' + overflow;
if(num >= 10) {
overflow = 1;
num -= 10;
} else {
overflow = 0;
}
res.append(String.valueOf(num));
}
if(overflow == 1)
res.append(1);
return res.reverse().toString();
}
//考虑正负
/**
* 求超大整数的和
* @param num1
* @param num2
* @return
*/
public static String bigNumberSumBetter(String num1, String num2) {
char sign = '+';
char sign1 = num1.charAt(0);
char sign2 = num2.charAt(0);
String number1 = "";
String number2 = "";
// 去符号位操作
if (sign1 == '-' || sign1 == '+') {
number1 = num1.substring(1);
} else {
sign1 = '+';
number1 = num1;
}
// 去符号位操作
if (sign2 == '-' || sign2 == '+') {
number2 = num2.substring(1);
} else {
sign2 = '+';
number2 = num2;
}
boolean isDig1 = number1.matches("[1-9][0-9]*");
boolean isDig2 = number2.matches("[1-9][0-9]*");
if (!isDig1 || !isDig2) {
throw new NumberFormatException("输入的数据不是正确的格式的整数");
}
//两个数的长度
int length1 = number1.length();
int length2 = number2.length();
int len = length1>=length2? length1+1:length2+1;
StringBuffer number1Buffer = new StringBuffer();
StringBuffer number2Buffer = new StringBuffer();
//扩展数据的长度,使它们的长度一样
if(length1>length2){
for(int i=0; i<length1-length2; i++){
number2Buffer.append("0");
}
}else if(length1<length2){
for(int i=0; i<length2-length1; i++){
number1Buffer.append("0");
}
}
number1Buffer.append(number1);
number2Buffer.append(number2);
char[] chars1 = number1Buffer.reverse().toString().toCharArray();
char[] chars2 = number2Buffer.reverse().toString().toCharArray();
//存储每位相加的结果
int[] result = new int[len];
//同号相加
if(sign1==sign2){
sign = sign1;
for(int i=0; i<len-1; i++){
result[i] = (chars1[i]-'0')+(chars2[i]-'0');
}
// 处理进位
for (int i = 0; i < len; i++) {
if (result[i] >= 10) {
result[i + 1] += result[i] / 10;
result[i] = result[i] % 10;
}
}
}else {
// 拿大的数减去小的数
boolean lager = number1.compareTo(number2)>0 ? true : false;
if (lager) {
sign = sign1;
for (int i = 0; i < len-1; i++) {
result[i] = (chars1[i] - '0') - (chars2[i] - '0');
}
} else {
sign = sign2;
for (int i = 0; i < len-1; i++) {
result[i] = (chars2[i] - '0') - (chars1[i] - '0');
}
}
// 处理借位
for (int i = 0; i < len; i++) {
if (result[i] < 0) {
result[i] += 10;
result[i + 1]--;
}
}
}
// 结果没有进位时的0处理
boolean flag = true;
StringBuffer resultStr = new StringBuffer();
for (int i = result.length - 1; i >= 0; i--) {
if (result[i] == 0 && flag) {
continue;
}
flag = false;
resultStr.append(result[i]);
}
// 符号处理
if (sign == '-') {
return "-" + resultStr.toString();
} else {
return resultStr.toString();
}
}
}
网友评论