题目描述
给定两个字符串形式的非负整数 num1 和 num2 ,计算他们的差。
要求:
1) num1 和 num2 的长度都小于5000;
2)num1 和 num2 都只包含数字 0-9;
3)num1 和 num2 都不包含任何前导0;
4)不考虑差为负数的情况;也即只考虑整数num1>=num2的情况。
解题思路
将两个字符串处理成等长的,字符串从后往前减,因为append 是后插的所以后边注意反转,(另外的思路是将等长字符串反转,这样下标就可以一致了),最后一定要对字符串可能出现的前导零做处理。
实现代码
package java_20200808;
/**
* @ Created with IntelliJ IDEA.
* @ClassName Demo
* @Description
* @Author by小房
* @Date 2020/8/8 21:11
*/
public class Demo {
public static void main(String[] args) {
System.out.println(helper("12345689", "789"));
}
public static String helper(String num1, String num2) {
while(num1.length() < num2.length()) {
num1 = "0" + num1; //预处理成等长字符串
}
while(num2.length() < num1.length()) {
num2 = "0" + num2; //预处理成等长字符串
}
StringBuilder s1 = new StringBuilder(num1);
StringBuilder s2 = new StringBuilder(num2);
StringBuilder r = new StringBuilder();
int flag =0; //用flag标记借位
for(int i = s1.length()-1; i >= 0; --i) {
int sum = f(s1.charAt(i)) - flag - f(s2.charAt(i));
flag = 0;
r.append((sum+10)%10);
if (sum < 0){
flag = 1;
}
}
String str = r.reverse().toString();// 注意要反转
// 注意输出 0000 前导0的情况
int len = str.length();
int index = 0;
while( index < len && str.charAt(index) == '0' ) {
index++;
}
if (index == len) {
return "0";
}else {
return str.substring(index, len);
}
}
public static int f(char c) { return c - '0';} //字符变数字
}