大数相减(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));
}
}
}
}
现在就将结果贴出来:
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));
}
}
}
}
相关文章推荐
- 大数相乘、大数相加、大数相减Java版本
- 大数相加,相减,相乘算法(JAVA代码)
- 大数相乘、大数相加、大数相减Java版本
- 大数相乘、大数相加、大数相减Java版本
- 数相乘、大数相加、大数相减Java版本
- 大数相乘、大数相加、大数相减Java版本
- Java中的大数操作(相加,相减,相乘)
- hdu1250(Java)大数相加的问题
- java ACM 大数相加使用的bigInteger
- poj-1503-java大数相加
- java中栈的应用-大数的相加
- 数据结构(java语言描述)顺序栈的使用(两个大数相加)
- poj 1503 大数相加(java)
- 大数相加,大数相除,大数相除,大数相减
- java中用ArrayList类实现正整数大数相加与相乘
- JAVA 大数相加 POJ 1503
- HDU A + B Problem II(高精度大数相加)(java版)
- 面试常见题目:大数相加的Java实现(考虑负数情况)
- POJ 1503 Integer Inquiry【大数相加 java】
- 华为2013机试题 大数相减JAVA实现