方法一
char[] s1 被减数,用字符数组表示,位数不限
char[] s2 减数,用字符数组表示,位数不限
char[] t 结果,用字符数组表示
默认s1 >= s2,程序未处理负数情况
import java.math.BigDecimal;
import java.net.StandardSocketOptions;
import java.util.Scanner;
public class 减法 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String ss1 = sc.next();
String ss2 = sc.next();
char[] s1 = ss1.toCharArray();
char[] s2 = ss2.toCharArray();
char[] res = new char[100];
sub(s1, s2, res);
for(int i = 0; i < res.length;i++) {
if(res[i] == '\0') break;
System.out.print(res[i]);
}
}
public static void sub(char[] s1,char[] s2,char[] t) {
int i,l2,l1,k;
l2 = s2.length;
l1 = s1.length;
t[l1] = '\0';l1--;
for(i = l2 - 1;i >= 0;l1--,i--) {
if(s1[l1] - s2[i] >= 0) {
t[l1] = (char) (s1[l1] - s2[i] + '0');
}else {
t[l1] = (char) (10 + s1[l1] - s2[i] + '0');
s1[l1 - 1] = (char) (s1[l1 - 1] - 1);
}
}
k = l1;
if(k >= 1) {
while(s1[k] < 0) {
s1[k] += 10;
s1[k - 1] -= 1;
k--;
if(k < 1) break;
}
}
while(l1 >= 0) {
t[l1] = s1[l1];
l1--;
}
while(t[0] == '0') {
l1 = s1.length;
for(i = 0;i < l1 - 1;i++) {
t[i] = t[i + 1];
}
t[l1 - 1] = '\0';
}
if(t.length == 0) {
t[0] = '0';
t[1] = '\0';
}
}
}
这里有要注意的地方,其实我之前也提过。char c = '7';
char cc = (char)(c + 1);
这里输出cc结果为8
可是如果这样呢
char c = '7'
char cc = (char)(c - 1 + '0')
这里输出的结果为 f,有人可能想为什么不是6
如果你仔细去思索一下 char cc = (char) ('0' + '0') 的结果是什么呢?
那么就应该会明白了。
//题外话,有人问说这个有什么用呢?,我想说如果连这个都看不懂,那你怎么看懂上面的代码。
方法二
import java.math.BigDecimal;
import java.net.StandardSocketOptions;
import java.util.Scanner;
public class 减法 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s1 = sc.next();
String s2 = sc.next();
BigDecimal bd1 = new BigDecimal(s1);
BigDecimal bd2 = new BigDecimal(s2);
BigDecimal bd3 = bd1.subtract(bd2);
System.out.println(bd3);
}
}