大数字符串的四则运算之加法----Java代码实现
2017-08-04 17:05
781 查看
大数相加
具体实现步骤1. 如果两个数同号,则记录符号为,对除符号为以为的数进行相加计算;
2. 如果两个数异号,则比较个数大小,记录较大数的符号位为和的符号位,然后对除符号为以为的数进行相减计算;
两个大正整数的加法实现思想
1. 从两个字符串的尾部(即最后一个字符)开始,逐个个字符相加并加上进位标志位tag,如果和大于9,将进位标志位tag=1,否则为tag=0,并将和的个位保存到最终数组中;
2. 循环,直到两个数全部遍历完;
3. 图解除符号为之外的两个大数相加思想
4.
Java代码实现
/** * 两个正大数相加 * @param num1 * @param num2 * @param isPositive 结果正负标志位 * */ public static StringBuffer addPositionNum(String num1,String num2, boolean isPositive) { int i = num1.length() - 1; int j = num2.length() - 1; int tag = 0; //进位; 1有进位,0无进位 int sum; //计算整数和 //注意new StringBuffer(" ")必须存入一位空格,以便不断插入所计算的和 StringBuffer str = new StringBuffer(" "); while (i >= 0 && j >= 0) { sum = (num1.charAt(i) - '0') + (num2.charAt(j)-'0') + tag; if (sum > 9) { tag = 1; sum = sum % 10; }else { tag = 0; } str.insert(1, sum); i--;j--; } while (i >= 0) { if (tag > 0) { //说明地位有进位 sum = (num1.charAt(i)-'0')+tag; if (sum > 9) { tag = 1; sum = sum % 10; }else { tag = 0; } str.insert(1, sum); i--; }else { sum = num1.charAt(i)-'0'; str.insert(1, sum); i--; } } while (j >= 0) { if (tag > 0) { sum = num2.charAt(j)-'0'+tag; if (sum > 9) { tag = 1; sum = sum % 10; }else{ tag = 0; } str.insert(1, sum); j--; }else { sum = num2.charAt(j)-'0'; str.insert(1, sum); j--; } } //如果最高位有进位,则在最高位加入1 if (tag == 1) { str.insert(1, 1); } if (!isPositive) { str.insert(1, "-"); } System.out.println("add"+str); return str; }
以上方法实现了两个大正数的相加,下面我们继续看看大正数相减,因为计算两个有符号数相加会用到相减的方法;
除符号位外的两个大正数相减运算思想
看图应该比较明白一点
Java代码实现
/** * 两个正数相减 * @param num1 * @param num2 * @param isPositive */ public static StringBuffer subPositiveNum(String num1,String num2, boolean isPositive) { int tag = 0; int sub = 0; StringBuffer str = new StringBuffer(" "); if (num1.length() < num2.length() || num1.compareTo(num2) < 0) { String temp = num1; num1 = num2; num2 = temp; } int i = num1.length()-1; int j = num2.length()-1; while (i >= 0 && j >= 0) { sub = (num1.charAt(i) - '0')-(num2.charAt(j)-'0')+tag; if (sub < 0) { tag = -1; sub = 10 + sub; }else { tag = 0; } str.insert(1, sub); i--;j--; } while (i >= 0) { if (tag < 0) { sub = (num1.charAt(i) - '0')+tag; if (sub < 0) { tag = -1; sub = sub + 10; }else { tag = 0; } str.insert(1, sub); i--; } else { sub = num1.charAt(i) - '0'; str.insert(1, sub); i--; } } if (!isPositive) { str.insert(1, '-'); } System.out.println("sub"+str); return str; }
基本工作做完了,接下来实现两个字符串大数的相加
Java代码的实现
public static void add(String num1,String num2){ if (num1.length() <= 0 && num2.length() <= 0) return; boolean isPositive = true; StringBuffer result = new StringBuffer(); if (num1.charAt(0) == '-'&&num2.charAt(0) == '-') { //两个负数相加;去掉符号 result = addPositionNum(num1.substring(1), num2.substring(1), false); }else if(num1.charAt(0) != '-'&&num2.charAt(0) != '-'){ //两个正数相加 result = addPositionNum(num1, num2, true); }else if(num1.charAt(0) == '-'){ //两个数异号,做减法运算 num1 = num1.substring(1); //确定计算后的正负 if (num1.compareTo(num2) >= 0) { isPositive = false; }else { isPositive = true; } result = subPositiveNum(num1, num2, isPositive); }else if (num2.charAt(0) == '-') { num2 = num2.substring(1); if (num2.compareTo(num1) >= 0) { isPositive = false; }else { isPositive = true; } result = subPositiveNum(num1, num2, isPositive); } System.out.println("两个数相加的结果:"+result); }
因为相减和相加都需要用到上面说的方法,那么这里给出相减的方法;
public static void subtract(String num1,String num2) { boolean isPositive = true; StringBuffer result = new StringBuffer(); if (num1.charAt(0) == '-' && num2.charAt(0) == '-') { //两个数都为负 if (num1.compareTo(num2) > 0) isPositive = false; result = subPositiveNum(num1.substring(1), num2.substring(1), isPositive); }else if(num1.charAt(0) != '-' && num2.charAt(0) != '-'){ if (num1.compareTo(num2) < 0) isPositive = false; result = subPositiveNum(num1, num2, isPositive); }else if(num1.charAt(0) == '-'){ isPositive = false; result = addPositionNum(num1.substring(1), num2, isPositive); }else if(num2.charAt(0) == '-'){ result = addPositionNum(num1, num2.substring(1), isPositive); } System.out.println("两个数相减的结果:"+result); }
最后给出Java自带的大数计算类,以便大家验证
//自带类库实现大数相乘 public static void bigNumMultiply(String str1,String str2) { BigInteger a = new BigInteger(str1); BigInteger b = new BigInteger(str2); System.out.println("两个大数的运算结果为"); BigInteger c = a.add(b); BigInteger d = a.subtract(b); BigInteger e = a.multiply(b); BigInteger f = a.divide(b); BigInteger g = a.remainder(b); System.out.println("加"+ c); System.out.println("减"+ d); System.out.println("乘"+ e); System.out.println("除"+ f); System.out.println("取余"+ g); }
这里给出另一种计算两个大整数相加的方法,以便参考和记录学习;
/** * 高精度加法函数 */ public static int[] add(char[] ch1,char[] ch2,int len1,int len2) { //两个数同号,则直接相加 int len = len1>=len2 ? len1+1 : len2+1; int[] result = new int[len]; //存放结果 int i = ch1.length -1,j = ch2.length -1,k = len-1; while(i >= 0 && j >= 0){ //如果两个数都在界内,则进行加法运算 int n1 = Integer.valueOf(String.valueOf(ch1[i])); int n2 = Integer.valueOf(String.valueOf(ch2[j])); result[k] = n1 + n2; i--;j--;k--; } while(i >= 0){ int n1 = Integer.valueOf(String.valueOf(ch1[i])); result[k] = n1; i--;k--; } while(j >= 0){ int n2 = Integer.valueOf(String.valueOf(ch2[j])); result[k] = n2; j--;k--; } //进位修补 for (int m = len-1; m > 0; m--) { if (result[m] > 9) { result[m-1] = result[m]/10+result[m-1] ; result[m] = result[m]%10; } } //两个数异号,则比较大小,做减法运算 return result; }
相关文章推荐
- 大数的四则运算之除法----Java代码实现
- 大数的四则运算之乘法----Java代码实现
- 大数乘法运算Java代码实现
- JAVA实现字符串四则运算
- 大数据的加法运算Java代码实现
- PHP 实现后缀表达式(接受四则运算字符串,输出计算结果,附代码)
- Java实现大数运算的实例代码
- java中实现四则运算代码
- Java字符串的大数加法和乘法实现
- Java实现字符串四则运算(带小数点)
- java实现字符串四则运算公式解析工具类
- 大数项目:用字符串表示超过内存表示范围的大数据并实现四则运算
- Java实现四则混合运算代码示例
- 大数运算之加法乘法---JAVA实现
- java实现大数加法(BigDecimal)的实例代码
- java实现字符串四则运算公式解析工具类的方法
- Java代码实现四则运算
- Java实现四则运算表达式计算
- java第二周作业--实现分数的四则运算
- java小练习(实现分数的四则运算)