题解 | #大数相减#
大数相减
https://www.nowcoder.com/practice/ae4d84312e384a1fa100b613f93f3fe0
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num1 string字符串
* @param num2 string字符串
* @return string字符串
*/
public String substring (String a, String b) {
// write code here
if (compare(a, b) == -1) {
return "-" + substring(b, a) ;
}
int c = 0 ;
int i = a.length() - 1, j = b.length() - 1 ;
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0) {
//以下为一种写法
/*
int m = (i >= 0 ? a.charAt(i) - '0' : 0) - c ;
int n = j >= 0 ? b.charAt(j) - '0' : 0 ;
if (m < n) {
sb.append(m + 10 - n);
c = 1 ;
} else {
sb.append(m - n);
c = 0 ;
}
*/
//以下为另一种写法
int m = i >= 0 ? a.charAt(i--) - '0' : 0 ;//m为被减数,上面那个
int n = j >= 0 ? b.charAt(j--) - '0' : 0 ;//n为减数,下面那个
if(m - c - n < 0) {
//如果是1-2,需要借位,即借来10,变成11-2=9
sb.append((m - c - n + 10)) ;
c=1;
}
else {
sb.append(m-n-c);
c=0;
}
//或者统一写成sb.append((m - c - n + 10) % 10);
//这样写的话如果m-c-n<0,如1-2,借位11-2=9,9%10=9,结果正确
//如果m-c-n>0,如3-2,13-2=11,11%10=1,结果正确
}
String ret = sb.reverse().toString();
//删除前导0
/*
例如,当121-120=001,需要将前面的0删除,得到最终结果1。注意121-121=000这种情况,不要把所有0都删了!
*/
i = 0 ;
while (i < ret.length() - 1 && ret.charAt(i) == '0') i++;
return ret.substring(i, ret.length());
}
//比较a和b的大小
int compare (String a, String b){
int m = a.length();
int n = b.length();
if (m != n) {
return m > n ? 1 : -1;
}
int i = 0;
while (i < n) {
int p = a.charAt(i) ;
int q = b.charAt(i) ;
if (p > q) {
return 1 ;
} else if (p < q) {
return -1 ;
} else {
i++;
}
}
return 0 ;
}
}
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num1 string字符串
* @param num2 string字符串
* @return string字符串
*/
public String substring (String a, String b) {
// write code here
if (compare(a, b) == -1) {
return "-" + substring(b, a) ;
}
int c = 0 ;
int i = a.length() - 1, j = b.length() - 1 ;
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0) {
//以下为一种写法
/*
int m = (i >= 0 ? a.charAt(i) - '0' : 0) - c ;
int n = j >= 0 ? b.charAt(j) - '0' : 0 ;
if (m < n) {
sb.append(m + 10 - n);
c = 1 ;
} else {
sb.append(m - n);
c = 0 ;
}
*/
//以下为另一种写法
int m = i >= 0 ? a.charAt(i--) - '0' : 0 ;//m为被减数,上面那个
int n = j >= 0 ? b.charAt(j--) - '0' : 0 ;//n为减数,下面那个
if(m - c - n < 0) {
//如果是1-2,需要借位,即借来10,变成11-2=9
sb.append((m - c - n + 10)) ;
c=1;
}
else {
sb.append(m-n-c);
c=0;
}
//或者统一写成sb.append((m - c - n + 10) % 10);
//这样写的话如果m-c-n<0,如1-2,借位11-2=9,9%10=9,结果正确
//如果m-c-n>0,如3-2,13-2=11,11%10=1,结果正确
}
String ret = sb.reverse().toString();
//删除前导0
/*
例如,当121-120=001,需要将前面的0删除,得到最终结果1。注意121-121=000这种情况,不要把所有0都删了!
*/
i = 0 ;
while (i < ret.length() - 1 && ret.charAt(i) == '0') i++;
return ret.substring(i, ret.length());
}
//比较a和b的大小
int compare (String a, String b){
int m = a.length();
int n = b.length();
if (m != n) {
return m > n ? 1 : -1;
}
int i = 0;
while (i < n) {
int p = a.charAt(i) ;
int q = b.charAt(i) ;
if (p > q) {
return 1 ;
} else if (p < q) {
return -1 ;
} else {
i++;
}
}
return 0 ;
}
}