您的位置:首页 > 编程语言 > Java开发

大数字符串的四则运算之加法----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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: