昨天写完大数相加的算法,好友clyde叫我写个大数相减的算法,一开始还觉得会相当简单,还说五分钟搞定,没想到一写写了都快一个小时了,哎,真郁闷。
现在就将结果贴出来:
import java.util.Scanner;
import java.util.regex.Pattern;
public class ACM1002 {
public static void main(String[] args) {
//aplusb(new StringBuilder("99"), new StringBuilder("99"));
// System.out.println('1' + 1 - 48);
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if (n >= 1 && n <= 20) {
StringBuilder s1, s2;
for (int k = 1; k <= n; k++) {
s1 = new StringBuilder(sc.next());
s2 = new StringBuilder(sc.next());
Pattern pattern = Pattern.compile("[0-9]+?");
if (!pattern.matcher(s1).matches() || !pattern.matcher(s2).matches()) {
System.out.println("Error");
System.out.println("s1 = /""+s1+"/", s2 = /""+s2+"/"");
k --;
}
if(s1.length() > 1000 || s2.length() > 1000)
continue;
System.out.println("Case " + k + ":");
System.out.print(s1 + " - " + s2 + " = ");
//aplusb(s1, s2);
asubtractb(s1, s2);
if(k != n)
System.out.println();
}
}
}
static void aplusb(StringBuilder s1, StringBuilder s2) {
int l1 = s1.length(), l2 = s2.length();
int sum, tmp = 0;
if (l1 > l2) {
for (int i = l1 - 1, j = l2 - 1; j >= 0; i--, j--) {
sum = s1.charAt(i) - 48 + s2.charAt(j) - 48 + tmp;
tmp = sum / 10;
sum = sum % 10;
s1.setCharAt(i, (char) (sum + 48));
//System.out.println(sum);
}
for (int i = l1 - l2 - 1; i >= 0; i--) {
sum = s1.charAt(i) + tmp - 48;
//System.out.println(sum);
tmp = sum / 10;
sum = sum % 10;
s1.setCharAt(i, (char) (sum + 48));
}
if(tmp > 0)
System.out.println(tmp + "" + s1);
else
System.out.println(s1);
} else {
for (int i = l2 - 1, j = l1 - 1; j >= 0; i--, j--) {
sum = s2.charAt(i) - 48 + s1.charAt(j) - 48 + tmp;
tmp = sum / 10;
sum = sum % 10;
s2.setCharAt(i, (char) (sum + 48));
//System.out.println(sum);
}
for (int i = l2 - l1 - 1; i >= 0; i--) {
sum = s2.charAt(i) + tmp - 48;
//System.out.println(sum);
tmp = sum / 10;
sum = sum % 10;
s2.setCharAt(i, (char) (sum + 48));
}
if(tmp > 0)
System.out.println(tmp + "" + s2);
else
System.out.println(s2);
}
}
static void asubtractb(StringBuilder s1, StringBuilder s2) {
int l1 = s1.length(), l2 = s2.length();
int minus, tmp = 0;
if (l1 > l2) {
StringBuilder s = new StringBuilder(s1);
for (int i = l1 - 1, j = l2 - 1; j >= 0; i--, j--) {
if((s1.charAt(i) - tmp) < s2.charAt(j)){
minus = s1.charAt(i) + 10 - s2.charAt(j) - tmp;
tmp = 1;
} else {
minus = s1.charAt(i) - s2.charAt(j) - tmp;
tmp = 0;
}
s1.setCharAt(i, (char) (minus + 48));
//System.out.println('6' - '3');
}
for (int i = l1 - l2 - 1; i >= 0; i--) {
if(s1.charAt(i) < tmp){
minus = s1.charAt(i) + 10 - tmp - 48;
tmp = 1;
} else {
minus = s1.charAt(i) - tmp - 48;
tmp = 0;
}
s1.setCharAt(i, (char) (minus + 48));
}
if(s1.charAt(0) > '0')
System.out.println(s1);
else
System.out.println(s1.substring(1));
} else if (l2 > l1){
for (int i = l2 - 1, j = l1 - 1; j >= 0; i--, j--) {
if((s2.charAt(i) - tmp) < s1.charAt(j)){
minus = s2.charAt(i) + 10 - s1.charAt(j) - tmp;
tmp = 1;
} else {
minus = s2.charAt(i) - s1.charAt(j) - tmp;
tmp = 0;
}
s2.setCharAt(i, (char) (minus + 48));
//System.out.println(sum);
}
for (int i = l2 - l1 - 1; i >= 0; i--) {
if(s2.charAt(i) < tmp){
minus = s2.charAt(i) + 10 - tmp - 48;
tmp = 1;
} else {
minus = s2.charAt(i) - tmp - 48;
tmp = 0;
}
s2.setCharAt(i, (char) (minus + 48));
}
if(s2.charAt(0) > '0')
System.out.println("-" + s2);
else
System.out.println("-" + s2.substring(1, l2));
} else if (l1 == l2){
StringBuilder s = new StringBuilder(s1);
for (int i = l2 - 1; i >= 0; i--) {
if((s2.charAt(i) - tmp) < s1.charAt(i)){
minus = s2.charAt(i) + 10 - s1.charAt(i) - tmp;
tmp = 1;
} else {
minus = s2.charAt(i) - s1.charAt(i) - tmp;
tmp = 0;
}
s.setCharAt(i, (char) (minus + 48));
//System.out.println(sum);
}
if(tmp == 1){
tmp = 0;
for (int i = l2 - 1; i >= 0; i--) {
if((s1.charAt(i) - tmp) < s2.charAt(i)){
minus = s1.charAt(i) + 10 - s2.charAt(i) - tmp;
tmp = 1;
} else {
minus = s1.charAt(i) - s2.charAt(i) - tmp;
tmp = 0;
}
s.setCharAt(i, (char) (minus + 48));
//System.out.println(sum);
}
// if(s.charAt(0) > '0'){
// System.out.println(s);
// } else {
// System.out.println(s.substring(1));
// }
int i;
for(i = 0; i < l1; i ++){
if(s.charAt(i) != '0') break;
}
if(i == l1) System.out.println(0);
else System.out.println(s.substring(i));
} else {
// if(s.charAt(0) > '0'){
// System.out.println("-" + s);
// } else {
// System.out.println("-" + s.substring(1));
// }
int i;
for(i = 0; i < l1; i ++){
if(s.charAt(i) != '0') break;
}
if(i == l1) System.out.println(0);
else System.out.println("-" + s.substring(i));
}
}
}
}