/*
* @topic:任意位的實數的加減法
*/
import java.util.Scanner;
public class RnumAddSub {
static char[] a;//數a
static char[] b;//數b
static char f = ' ';/*減法時的符號位*/
/*na爲a的長度,na1爲a的整數部分長度,na2爲a的小數部分長度,nb爲b的以上長度,nc爲結果的以上長度*/
static int na, na1, na2, nb, nb1, nb2, nc, nc1, nc2;
public static void main(String args[]) {
//System.out.println("Hello Landor");
Scanner sc = new Scanner(System.in);
String q = sc.next();
String p = sc.next();
System.out.println(plus(q, p));
System.out.println(sub(q, p));
}
private static void init(StringBuffer sb1, StringBuffer sb2) {/*對a,b數組進行初始化*/
int i, k;
a = new char[127];
b = new char[127];
if (sb1.indexOf(".") == -1)/*若輸入爲整數,則在後面補上“.0”*/
sb1.append(".0");
if (sb2.indexOf(".") == -1)
sb2.append(".0");
na = sb1.length();
na1 = sb1.indexOf(".");
na2 = na - na1 - 1;
nb = sb2.length();
nb1 = sb2.indexOf(".");
nb2 = nb - nb1 - 1;
nc1 = na1 > nb1 ? na1 : nb1;/*計整數和小數最大長度*/
nc2 = na2 > nb2 ? na2 : nb2;
nc = nc1 + nc2 + 1;
if (na2 < nc2)/*小數位少者補0*/
for (i = 1; i <= nc2 - na2; i++)
sb1.append("0");
if (nb2 < nc2)
for (i = 1; i <= nc2 - nb2; i++)
sb2.append("0");
for (i = 0; i < sb1.length(); i++)
a[i] = sb1.charAt(i);
for (i = 0; i < sb2.length(); i++)
b[i] = sb2.charAt(i);
if (na1 < nc1) {/*整數位少者先後移,左補0*/
k = nc1 - na1;
for (i = nc; i >= nc - na; i--)
a[i] = a[i - k];
for (i = 0; i < k; i++)
a[i] = '0';
a[nc] = '\0';
} else if (nb1 < nc1) {
k = nc1 - nb1;
for (i = nc; i >= nc - nb; i--)
b[i] = b[i - k];
for (i = 0; i < k; i++)
b[i] = '0';
b[nc] = '\0';
}
}
public static String plus(String x, String y) {/*加法*/
init(new StringBuffer(x), new StringBuffer(y));
int w = 0;
for (int i = nc - 1; i >= 0; i--) {
if (a[i] == '.')
continue;
a[i] = (char) (a[i] + b[i] + w - '0');/*做加法並調整進位*/
if (a[i] > '9') {
w = 1;
a[i] -= 10;
} else
w = 0;
}
a[nc] = '\0';
return w == 1 ? "1" + (new String(a)).substring(0, nc)
: (new String(a)).substring(0, nc);
}
public static String sub(String x, String y) {/*減法*/
init(new StringBuffer(x), new StringBuffer(y));
if (new String(a).compareTo(new String(b)) < 0) {/*a<b交換*/
for (int i = 0; i < nc; i++) {
f = a[i];
a[i] = b[i];
b[i] = f;
}
f = '-';
}
int w = 0;
for (int i = nc - 1; i >= 0; i--) {
if (a[i] == '.')
continue;
a[i] = (char) (a[i] - b[i] - w + '0');/*做減法並調整借位*/
if (a[i] < '0') {
w = 1;
a[i] += 10;
} else
w = 0;
}
a[nc] = '\0';
while (a[0] == '0')
System.arraycopy(a, 1, a, 0, a.length - 1);/*刪除前面無意義的0*/
a[nc] = '\0';
return f == '-' ? "-" + (new String(a)).substring(0, nc) : (new String(
a)).substring(0, nc);
}
}
對於負實數的運算,只需在運算前單獨加一個符號處理即可