java大数算法完成五则运算之加减
来源:互联网 发布:java整形转换为字符串 编辑:程序博客网 时间:2024/05/15 03:32
接昨天的《java大数算法完成五则运算之类基础》这篇文章,今天就先说说加减,毕竟比较简单,就丢一起了。
首先先说说算法思路,就是用最简单的最实用的,我们平时做加减的方法!数字右对齐,往左递推,依次运算,进位借位即可
废话不多说,直接上代码:
关于类中的其它方法和属性详看java大数算法完成五则运算之类基础,这里就不再讲了
public BigNum add(BigNum add) throws Exception { int addnum[] = add.NUM;//保存加的数组 char newNumSign = 0;//保存和的符号 int newNum[] = null;//保存和的数组 if (SIGN == add.SIGN) {//同正负号时,符号不变一致 newNumSign = SIGN; newNum = addnum(NUM, addnum);//调用加法 } else {//异号时,谁的绝对值比较大就用谁的符号 if (intArrCompaerTo(NUM, addnum) == 1) { newNumSign = SIGN; } else { newNumSign = add.SIGN; } newNum = subNum(NUM, addnum);//调用减法 } BigNum b = new BigNum(newNum, newNumSign); return b; } private int[] addnum(int a[], int b[]) { int p1;//较大大数数组运算指针,指针均从右往左 int p2;//较小大数数组运算指针 int num[] = null;//和数组 int p3;//和数组指针 if (a.length == b.length) {//当两个大数位数一样时 p1 = p2 = a.length - 1; num = new int[a.length + 1];//加一是因为有可能会多进一位 p3 = a.length; for (; p1 > -1; p1--) { int temp = 0;//保存每位之和 temp = a[p1] + b[p2--]; if (temp > 9) {//当前位之和大于9要进位 num[p3--] = temp % 10;//加上个位 num[p3] = temp / 10;//进位 } else { num[p3--] = temp; } } } else {//两个大数位数不相同时 int tempNum[] = a;//用临时数组保存当前对象的大数 if (a.length < b.length) {//tempNum恒存放大的大数,add存放小的大数 tempNum = b; b = a; } p1 = tempNum.length - 1; p2 = b.length - 1; num = new int[tempNum.length + 1]; p3 = tempNum.length; for (; p1 > -1; p1--) { int temp = 0;//保存每位的和 if (p2 < 0) {//较小数组可能会先加完 temp = tempNum[p1]; } else { temp = tempNum[p1] + b[p2--]; } if (temp > 9) {//进位 num[p3--] = temp % 10;//加上个位 num[p3] = temp / 10;//进位 } else { num[p3--] = temp; } } } return num; }
加法的代码就是这些,没什么很难的,就是稍微有点绕,要根据符号的不同来选择做加法还是减法,要根据位数不一样来写不同的实现方法,减法也是类似。
接下来是减法:
public BigNum sub(BigNum sub) throws Exception { int subNum[] = sub.NUM;//减数 char newNumSign = 0;//保存差的符号 int newNum[] = null;//保存差的数组 if (SIGN == sub.SIGN) {//符号相同时 switch (compareTo(sub)) {//比较大小 case -1://小于 newNumSign = '-'; break; case 0://等于 newNumSign = '+'; newNum = new int[1]; newNum[0] = 0; break; case 1://大于 newNumSign = '+'; break; } newNum = subNum(NUM, sub.NUM);//调用减法 } else {//异号 if (SIGN == '+') { newNumSign = '+'; } else { newNumSign = '-'; } newNum = addnum(NUM, sub.NUM);//调用加法 } BigNum b = new BigNum(newNum, newNumSign); return b; } private int[] subNum(int a[], int b[]) { int p1 = 0;//较大大数数组运算指针,指针均从右往左 int p2 = 0;//较小大数数组运算指针 int num[] = null;//余数组 int big[] = a;//保存较大数组,b保存较小数组 int p3 = 0;//余数组指针 switch (intArrCompaerTo(a, b)) {//比较两个数组大小,使得big恒保存较大数组 case -1://a小于b big = b; b = a; p1 = big.length - 1; p2 = b.length - 1; num = new int[big.length]; p3 = num.length - 1; break; case 0://a=b,结果为零,直接返回 num = new int[1]; num[0] = 0; return num; case 1://a大于b p1 = big.length - 1; p2 = b.length - 1; num = new int[big.length]; p3 = num.length - 1; break; } for (; p1 > -1; p1--) {//以大数组的长度来从右往左运算 if (p2 < 0) {//当大数组还有数字而小数组没有后执行 if (big[p1] < 0) {//如果当前位小于0,即在上一次循环中被借了一位,再往前借一次 big[p1 - 1] -= 1; big[p1] += 10; } num[p3--] = big[p1]; } else {//小数组还有数字 if (big[p1] < b[p2]) {//大数组的当前位小于小数组的当前位时借位 big[p1 - 1] -= 1; big[p1] += 10; } num[p3--] = big[p1] - b[p2--]; } } return num; }
阅读全文
0 0
- java大数算法完成五则运算之加减
- java大数算法完成五则运算之乘
- java大数算法完成五则运算之类基础
- java大数算法完成五则运算之除及取余
- 大数运算之加减乘法
- 大数运算-加减函数
- 大数的加减运算
- 大数加减乘法(Java)
- java算法-指数运算(大数运算)
- 大数运算:支持加减乘运算
- 大数big number的加减运算
- JAVA日期加减运算
- java日期加减运算
- JAVA日期加减运算
- JAVA日期加减运算
- JAVA日期加减运算
- JAVA日期加减运算
- JAVA日期加减运算 .
- HDU 4283 You Are the One(区间DP)
- oracle按章报错
- 一张图搞懂android事件分发机制
- http1.0 和 http1.1区别?
- 关于mysql中使用枚举类型还是int类型存取有限个固定值
- java大数算法完成五则运算之加减
- spark-streaming 读取kafka的方式
- 51Nod-1085-背包问题
- springboot + mongodb 查询实例
- vs2017无法查找或打开 pdb 文件
- microsoft visual c++ 6.0中文版两种使用方法
- 说说单例模式
- 关于springMVC无法加载静态资源的问题
- springMVC原理(二):SpringMVC核心分发器DispatcherServlet分析[附带源码分析]