加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数的加法,减法,乘法

发布时间:2020-12-14 02:00:51 所属栏目:大数据 来源:网络整理
导读:最近在研究算法,其中用到了大数的乘法,于是便对以前写过的大数的加法和减法,放在一起做了各总结,写了个BigData类 如有不完善的地方还请指正。 代码如下: package com.zjianhao.main;public class BigData {/** * 大数加法 * @param str1 加数 * @param

最近在研究算法,其中用到了大数的乘法,于是便对以前写过的大数的加法和减法,放在一起做了各总结,写了个BigData类

如有不完善的地方还请指正。

代码如下:

package com.zjianhao.main;

public class BigData {
	
	/**
	 * 大数加法
	 * @param str1 加数
	 * @param str2 加数
	 * @return	和
	 */
	
	public static String add(String str1,String str2){
		int len1 = str1.length();
		int len2 = str2.length();		
		int maxLength = len1>len2? len1:len2;
		int minLength = len1<len2? len1:len2;
		int size = maxLength - minLength;
		if (size>0&&len1>len2){
			for (int i=0; i<size; i++)
				str2 = "0"+str2;//位数不够前面补零,使两个字符串一样长,便于处理
		}else if (size>0&&len1<len2){
			for (int i=0; i<size; i++)
				str1 = "0"+str1;//位数不够前面补零,使两个字符串一样长,便于处理
		}
		int[] result = new int[maxLength+1];
		
		for (int i=0,j=maxLength-1; i<maxLength; i++,j--){
			result[j+1] += (str1.charAt(j)-'0')+(str2.charAt(j)-'0');
			if (result[j+1]>=10){
				result[j] = result[j+1]/10;
				result[j+1] = result[j+1]%10;
			}			
		}
		return removeFrontZero(result);
	}
	/**
	 * 被减数大于减数
	 * @param str1  被减数
	 * @param str2	减数
	 * @return 差
	 */
	public static String subtra(String str1,String str2){
		int len1 = str1.length();
		int len2 = str2.length();
		int maxLength = len1>len2? len1:len2;
		int minLength = len1<len2? len1:len2;
		int[] result = new int[maxLength];
		int size = maxLength - minLength;
		for (int i=0; i<size; i++)
			str2 = "0"+str2;//位数不够前面补零,使两个字符串一样长,便于处理
		for (int i=0,k=maxLength -1,m=len1-1; i<maxLength; i++,k--,m--){
			int num1= str1.charAt(m) - '0';
			int num2 = str2.charAt(m)- '0';
			if (num1 > num2)
				result[k] += num1 - num2;
			else {
				result[k] += num1+10 - num2;
				result[k-1] -= 1;//向前一位借一
			}
		}
		return removeFrontZero(result);
		
		
	}
	
	
	/**
	 * 带正负号的大整数减法,被减数和减数无大小限制
	 * @param str1 被减数
	 * @param str2	减数
	 * @return 差,被减数大于减数返回正数,被减数小于减数返回负数
	 */
	public static String subtraction(String str1,String str2){
		int len1 = str1.length();
		int len2 = str2.length();
		if (len1 > len2)
			return subtra(str1,str2);
		else if (len1 == len2){
			for (int i=0; i<len1; i++){
				int num = (str1.charAt(i) - '0') - (str1.charAt(i) - '0');
				if (num >0)
					return subtra(str1,str2);
				else if (num < 0)
					return '-'+subtra(str2,str1);
				else 
					continue;				
			}
			return "0";			
		}else
			return '-'+subtra(str2,str1);
	}
	
	/**
	 * 大整数乘法
	 * @param str1	乘数
	 * @param str2	乘数
	 * @return 积
	 */
	public static String multiplication(String str1,String str2){
		int len1 = str1.length();
		int len2 = str2.length();
		int [] result = new int[len1+len2];
		for (int i=len1-1,pos=len1+len2-1; i>=0; i--,pos--)
			for (int j=len2-1,k=pos; j>=0; j--,k--){
				result[k] += (str1.charAt(i)-'0')*(str2.charAt(j)-'0');
				if (result[k] >= 10){
					result[k-1] += result[k]/10;
					result[k] = result[k]%10;
				}				
			}
		return removeFrontZero(result);
	}
	/**
	 * 将数字前面的零去掉(数字不能以零开头)
	 * @param result
	 * @return
	 */
	public static String removeFrontZero(int [] result){
		//去除前边的零
				StringBuilder builder = new StringBuilder();
				int i;
				for (i=0; i<result.length; i++)
					if (result[i]!=0)
						break;
				for (int j=i; j<result.length; j++)
						builder.append(result[j]);	
				return builder.toString(); 
	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读