大数计算
通过对字符串进行操作,实现大数加法和减法。
加法
public static String bigAdd(String a, String b) {
char[] inta = new StringBuffer(a).reverse().toString().toCharArray();
char[] intb = new StringBuffer(b).reverse().toString().toCharArray();
char signa = a.charAt(0) == '-' ? '-' : '+';
char signb = b.charAt(0) == '-' ? '-' : '+';
if(signa == signb){
int lenA = a.length();
int lenB = b.length();
int len = (lenA < lenB ? lenB : lenA) + 1;
char[] intSum = new char[len];
for (int i = 0, carry = 0; i < len; i++) {
int aint = i < lenA ? (inta[i] - '0') : 0;
int bint = i < lenB ? (intb[i] - '0') : 0;
int sum = aint + bint + carry;
if (sum >= 10) {
intSum[i] = (char) (sum - 10 + '0');
carry = 1;
} else {
intSum[i] = (char) (sum + '0');
carry = 0;
}
}
StringBuffer sum = new StringBuffer(new String(intSum));
if (sum.charAt(sum.length() - 1) == '0') {
sum.deleteCharAt(sum.length() - 1);
}
if (sum.charAt(sum.length() - 1) == '*') {
sum.deleteCharAt(sum.length() - 1);
sum.append('-');
}
return sum.reverse().toString();
}else if(signa == '-'){
a = new StringBuffer(a).deleteCharAt(0).toString();
return bigSubtract(b, a);
}else{
b = new StringBuffer(b).deleteCharAt(0).toString();
return bigSubtract(a, b);
}
}
减法
public static String bigSubtract(String a, String b) {
char[] inta = new StringBuffer(a).reverse().toString().toCharArray();
char[] intb = new StringBuffer(b).reverse().toString().toCharArray();
char signa = a.charAt(0) == '-' ? '-' : '+';
char signb = b.charAt(0) == '-' ? '-' : '+';
//符号相同则进行减法,否则进行加法
if (signa == signb) {
// 减法
int lenA = inta.length;
int lenB = intb.length;
int len = lenA < lenB ? lenB : lenA;
char[] intSum = new char[len];
char signSum = '+';
if (lenA < lenB) {
signSum = '-';
} else if (lenA == lenB) {
int i = lenB - 1;
while(i > 0 && inta[i] == intb[i]){
i--;
}
if (inta[i] < intb[i]) {
signSum = '-';
}
}
//减法计算
for (int i = 0; i < len; i++) {
int aint = (i < lenA ? inta[i] - '0' : 0);
int bint = i < lenB ? intb[i] - '0' : 0;
if (signSum == '+') {
intSum[i] = (char) (aint - bint + '0');
} else {
intSum[i] = (char) (bint - aint + '0');
}
}
//若某位为负,则进行借位操作
for(int i = 0;i<len-1;i++){
if(intSum[i]<'0'){
intSum[i] += 10;
intSum[i+1]--;
}
}
StringBuffer sb = new StringBuffer(new String(intSum));
//去除前面的0
for(int i = len-1;i>=0;){
if(sb.charAt(len-1)=='0'){
sb.deleteCharAt((len--)-1);
}else{
i = -1;
}
}
//添加负号
if (signSum == '-') {
sb.append('-');
}
return sb.reverse().toString();
}
if (signa == '-') {
a = new StringBuffer(a).deleteCharAt(0).toString();
return "-" + bigAdd(a, b);
} else {
b = new StringBuffer(b).deleteCharAt(0).toString();
return bigAdd(a, b);
}
}