高精度运算——正实数的加减运算

 
/*
*	@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);
	}
}

对于负实数的运算,只需在运算前单独加一个符号处理即可
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值