说明
1、不是啥最优的算法,只是能计算
2、不一定完全没有错,只能在正数范围计算
3、思路,逐位计算合在一起就是结果
代码
package calculate;
public class Subtract {
public Subtract(){
/*可能存在的几种情况
* 1、两数长度相同,不存在借位情况
* 2、两数长度相同,借位
* 3、减数长度小于被减数,不借位
* 4、减数长度小于被减数,借位
* 5、减数长度小于被减数,连续借位
* */
System.out.println( subtract( "1000", "999") );
}
public String subtract( String num1, String num2 ){
//初始化差以及差的最长长度
String difference = "";
int len1 = num1.length(), len2 = num2.length();
//借位标记
int borrow = 0;
//最多循环len1次,依次计算每一位的差
for ( int i = 0; i < len1; i++ ){
//当前计算位小于减数时
if ( i < len2 ){
//初始化当前位
int number1 = Integer.parseInt( num1.substring(len1-i-1, len1-i) );
int number2 = Integer.parseInt( num2.substring(len2-i-1, len2-i) );
//进行计算
int tmp = number1-number2-borrow;
//判断是否需要借位
if ( tmp < 0 ){
borrow = 1;
tmp += 10;
}else{
borrow = 0;
}
//将本次计算结果存储
difference = tmp + difference;
}else{
//当前面的计算中存在借位情况时
while ( borrow == 1 ){
//初始化当前位的值,并进行计算
int number1 = Integer.parseInt( num1.substring(len1-i-1, len1-i) );
int tmp = number1-borrow;
//判断是否需要继续借位
if ( tmp < 0 ){
borrow = 1;
tmp += 10;
}else{
borrow = 0;
}
//将结果存储并将i加一
difference = tmp + difference;
i++;
}
//将剩下的更高位的值存储在结果中,并跳出循环
difference = num1.substring(0, len1-i) + difference;
break;
}
}
//通过循环,删除结果中前几位的0
for ( int i = 0; i < len1; i++ ){
if ( difference.charAt(i) != '0' ){
difference = difference.substring(i);
break;
}
}
return difference;
}
public static void main(String[] args) {
Subtract subtract = new Subtract();
}
}