高精度运算——正实数的加减运算
来源:互联网 发布:go语言编程 mobi 编辑:程序博客网 时间:2024/04/30 06:09
/**@topic:任意位的实数的加减法*/import java.util.Scanner;public class RnumAddSub {static char[] a;//数astatic char[] b;//数bstatic 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;} elsew = 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;} elsew = 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);}}
对于负实数的运算,只需在运算前单独加一个符号处理即可
- 高精度运算——正实数的加减运算
- 高精度运算——实数乘法
- 高精度加减乘运算
- 指针的加减运算
- 复数的加减运算
- 补码的加减运算
- 补码的加减运算
- 大数的加减运算
- 复数的加减运算
- 高精度运算——阶乘
- 运算符重载——分数加减
- 多项式加减运算—c语言描述
- 加减运算
- 指针的算术运算(1) 加减运算
- java日期的加减运算
- DOS下的加减运算
- 两个复数的加减运算
- 分数加减的简单运算
- Linux内核态抢占机制分析
- 【雷帝嘎嘎】:宁可打光棍也不和IT投资人约会的10个理由
- 浅谈css中图片定位之所有图标放在一张图上(一)
- 要冷静
- NDK r7 的新特性
- 高精度运算——正实数的加减运算
- 2011 ACM/ICPC 北京赛区现场赛解题:Peach Blossom Spring
- Dropbox:不仅仅是储存和同步
- Belkin推出无线拍照遥控器,专为iPhone而设的偷拍利器
- 转福布斯荐75本经商必读
- xen虚拟windows使用vnc桌面鼠标位置偏移现象的解决
- Linux TCP/IP 协议栈的关键数据结构Socket Buffer(sk_buff )
- 软件性能
- java多线程笔记