大数相乘

必须都要进行字符串翻转处理,从最低位开始按位相乘、相加、相减 否则位置不好对应,很容易出错。


package test1;

public class BigDataMinusAddCheng {
	public static void main(String[] args){
		String a = "129";
		String b = "44413";
		System.out.println(chengfa(a,b));
	//	System.out.println(add(a,b));
		System.out.println(minus(a,b));
	}
	/**************乘法******/
	public static String chengfa(String a,String b){
		// TODO 自动生成的方法存根
		System.out.print("乘法:"+"s"+"*"+"b"+"=");
		//获取首字母判断正负号
		char signA = a.charAt(0);
		char signB = b.charAt(0);
		char sign ='+';//初始化
		boolean flag1=true;boolean flag2=true;
		//不影响,因为如果没有符号就不用取子串了
		if(signA=='+' || signA=='-'){
			sign=signA;
			a=a.substring(1);
		}
		if(signB=='+' || signB=='-'){
			if(sign==signB){
				sign='+';
			}
			else{
				sign='-';
			}
			b=b.substring(1);
		}
		char[] A = new StringBuffer(a).reverse().toString().toCharArray();
		char[] B = new StringBuffer(b).reverse().toString().toCharArray();
		
		int[] res = new int[A.length+B.length];
		int[] x = new int[A.length];
		for(int i = 0;i<x.length;i++){
			x[i]=A[i]-'0';
		}
		int[] y = new int[B.length];
		for(int i = 0;i<y.length;i++){
			y[i]=B[i]-'0';
		}
		for(int i = 0;i<A.length;i++){
			for(int j=0;j<B.length;j++){
				res[i+j]+=x[i]*y[j];
			}
		}
		for(int i = 0;i<A.length+B.length;i++){
			if(res[i]>10){
				res[i+1]+=res[i]/10;
				res[i]=res[i]%10;
			}
		}
		StringBuffer sb  = new StringBuffer();
		boolean flag =true;
		for(int i = A.length+B.length-1;i>=0;i--){
			if(res[i]==0 && flag){
				continue;
			}
			else{
				flag=false;
			}
			sb.append(res[i]);
		}
		if(!sb.toString().equals("")){
			if(sign=='-'){
				sb.insert(0, sign);
			}
		}
		else{
			sb.append(0);
		}
		return (sb.toString());
	}
	/******************加法*******************/ 
	public static String add(String a,String b){
		System.out.print("加法:"+"s"+"+"+"b"+"=");
		char[] A = new StringBuffer(a).reverse().toString().toCharArray();
		char[] B = new StringBuffer(b).reverse().toString().toCharArray();
		int lenA = a.length();
		int lenB = b.length();
		int len = lenA>lenB?lenA:lenB;
		int[] res = new int[len+1];//留出进最高位
		for(int i=0;i<=len;i++){	
			int ai =  i<lenA ?(A[i]-'0'):0;
			int bi =  i<lenB ?(B[i]-'0'):0;
			res[i] = ai+bi;
		}
		for(int i = 0;i<=len;i++){
			if(res[i]>10){
				res[i+1]+=res[i]/10;
				res[i]=res[i]%10;
			}
		}
		StringBuffer sb = new StringBuffer();
		boolean flag =true;
		for(int i=len;i>=0;i--){
			if(res[i]==0 && flag){
				continue;
			}
			else{
				flag=false;
			}
			sb.append(res[i]);
		}
		return sb.toString();
	}
    /**************减法**************/
	public static String minus(String a,String b){
		System.out.print("减法:"+"s"+"-"+"b"+"=");
		char[] A=new StringBuffer(a).reverse().toString().toCharArray();
		char[] B=new StringBuffer(b).reverse().toString().toCharArray();
		int lenA = A.length;
		int lenB = B.length;
		int len = lenA>lenB?lenA:lenB;
		int [] res = new int[len];
		//找出结果的正负
		char sign='+';
		if(lenA<lenB){
			sign='-';
		}
		else if(lenA==lenB){
			int i=lenA -1;
			while(i>0&&A[i]==B[i]){
				i--;
			}
			if(A[i]<B[i]){
				sign='-';
			}
		}
		//计算结果
		for(int i=0;i<len;i++){
			int ai=i<lenA?(A[i]-'0'):0;
			int bi=i<lenB?(B[i]-'0'):0;
			if(sign=='+'){
				res[i]=ai -bi;
			}
			else{
				res[i]=bi-ai;
			}
		}
		for(int i=0;i<len-1;i++){
			if(res[i]<0){
				res[i]+=10;
				res[i+1]-=1;
			}
		}
		StringBuffer sb = new StringBuffer();
		for(int i=len-1;i>=0;i--){
			boolean flag=true;
			if(res[i]==0 && flag){
				continue;
			}
			else{
				flag=false;
			}
			sb.append(res[i]);
		}
		if(sign=='-'){
			sb.insert(0, '-');
		}
		return sb.toString();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值