需求:
求两大数之差
分析:
类似于大数相加,将字符串转成字符数组,进而转成整型数组,从后向前遍历两个数组,依次比较当前位两数的大小,如果被减数较大,直接相减,否则需要向前借位。
在算法实现时,将原数转成了整型数组,原因在于方便处理减法运算,如果转成字符数组,借位处理时不方便,对-1也不方便处理,因为-1算是两个字符。
代码:
/*
* 计算两大数之差
* */
class BigDataMinus{
//两大数之差
public static String bigDataMinus(String num1, String num2){
//如果两数相同,返回0
if(num1.equals(num2)){
return 0+"";
}
//定义结果的符号
int flag = 1;//初始化1,表示正数
if(num1.compareTo(num2) < 0){
flag = -1;//结果是负数
//交换两数
String temp = num1;
num1 = num2;
num2 = temp;
}
//将两数转成字符数组
char[] c1 = num1.toCharArray();
char[] c2 = num2.toCharArray();
//将字符数组转成整型数组
int[] i1 = new int[c1.length];
int[] i2 = new int[c2.length];
for(int m = 0; m < c1.length; m++){
i1[m] = c1[m]-'0';
}
for(int m = 0; m < c2.length; m++){
i2[m] = c2[m]-'0';
}
//创建缓冲区,存储结果
StringBuilder sb = new StringBuilder();
//从后向前遍历两个字符数组,进行结果求解
int i = i1.length-1, j = i2.length-1;
while(i >= 0 && j >= 0){
if(i1[i] >= i2[j]){
sb.append(i1[i]-i2[j]);//当被减数大的时候直接做减法运算
}
else{
sb.append(i1[i]-i2[j]+10);//当被减数小的时候需要向前一个数借位
i1[i-1] -= 1;//被借位的位应该减一
}
i--;
j--;
}
//将剩余内容存到缓冲区中
if(i >= 0){
for(int m = i; m >= 0; m--){
sb.append(i1[m]);
}
}
//将缓冲区中多余的0去除
int count = sb.length()-1;
for(; count >= 0; count--){
if(sb.charAt(count) != '0')
break;
}
//如果count>=0,说明0-count是有效位,否则说明该值是0
if(count >= 0){
sb.delete(count+1, sb.length());
}
else{
return 0+"";
}
//如果是负数,添加负号
if(flag == -1){
sb.append('-');
}
return sb.reverse().toString();
}
public static void main(String[] args){
String num1 = "199999999", num2 = "1999999990";
System.out.println(num1+"-"+num2+" = "+bigDataMinus(num1, num2));
}
}