您的位置:首页 > 编程语言 > Java开发

大数相减(JAVA)由昨天的大数相加联想而来

2010-07-22 11:27 603 查看
昨天写完大数相加的算法,好友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));

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: