大数相加、大数相乘

我们首先看大数相加,其基本思路是:

       过程和我们直接笔算思路一样,比如  129 + 23 ,先计算 9+3 = 12 ,则确定个位为2,同时向前进 1 ;继续 2 + 2 + 1 = 5,确定十位为5,同时向前进 0;继续 1 + 0 + 0 = 1,确定百位为1(其中该式中前一个0为12补齐的0,后一个0为进位的0);结束 得到结果为152。代码如下:

package pack1;

public class Multiply {

	/**
	 * @param 大数相加
	 */
	public String add(String str1,String str2){
		int jinwei = 0;
		StringBuffer sb1 = new StringBuffer(str1); sb1.reverse();
		StringBuffer sb2 = new StringBuffer(str2); sb2.reverse();
		int len1=sb1.length(),len2=sb2.length(),minLen = (len1>len2)?len2:len1;
		
		StringBuffer sb = new StringBuffer("");
		for(int i=0;i<minLen;i++){
			int single =Integer.parseInt(sb1.charAt(i)+"")+Integer.parseInt(sb2.charAt(i)+"")+jinwei;
			sb.append(single%10);
			jinwei = single /10;
		}
		
		if(len1==len2){
			if(jinwei!=0)  sb.append(jinwei);
			return sb.reverse().toString();
		
		}else if(len1>len2){
			
			for(int i=len2;i<len1;i++){
				int single =Integer.parseInt(sb1.charAt(i)+"")+jinwei;
				sb.append(single%10);
				jinwei = single /10;
			}
			if(jinwei!=0) sb.append(jinwei);
			return sb.reverse().toString();
		
		}else{
			
			for(int i=len1;i<len2;i++){
				int single =Integer.parseInt(sb2.charAt(i)+"")+jinwei;
				sb.append(single%10);
				jinwei = single /10;
			}
			if(jinwei!=0) sb.append(jinwei);
			return sb.reverse().toString();
		}
	}
	
	
        public static void main(String[] args) {
		Multiply mul = new Multiply();
		System.out.println(mul.add("8882488", "123888234248888"));
		//使用BigInteger
               java.math.BigInteger  big1 = new java.math.BigInteger("8882488");
               java.math.BigInteger  big2 = new java.math.BigInteger("123888234248888");
               System.out.println(big1.add(big2).toString());
	}

}

大数相乘

大数相乘怎么做呢,比如计算129 * 23,算法思路为:将乘法变换为加法进行计算。首先取23的个位3,代表129需要相加3次;然后再取23的十位2,代表129需要相加2次,并且同时需要在乘以10,则可以得到最后的结果。代码如下:

package pack1;

public class Multiply {

	/**
	 * @param 大数相加
	 */
	public String add(String str1,String str2){
		int jinwei = 0;
		StringBuffer sb1 = new StringBuffer(str1); sb1.reverse();
		StringBuffer sb2 = new StringBuffer(str2); sb2.reverse();
		int len1=sb1.length(),len2=sb2.length(),minLen = (len1>len2)?len2:len1;
		
		StringBuffer sb = new StringBuffer("");
		for(int i=0;i<minLen;i++){
			int single =Integer.parseInt(sb1.charAt(i)+"")+Integer.parseInt(sb2.charAt(i)+"")+jinwei;
			sb.append(single%10);
			jinwei = single /10;
		}
		
		if(len1==len2){
			if(jinwei!=0)  sb.append(jinwei);
			return sb.reverse().toString();
		
		}else if(len1>len2){
			
			for(int i=len2;i<len1;i++){
				int single =Integer.parseInt(sb1.charAt(i)+"")+jinwei;
				sb.append(single%10);
				jinwei = single /10;
			}
			if(jinwei!=0) sb.append(jinwei);
			return sb.reverse().toString();
		
		}else{
			
			for(int i=len1;i<len2;i++){
				int single =Integer.parseInt(sb2.charAt(i)+"")+jinwei;
				sb.append(single%10);
				jinwei = single /10;
			}
			if(jinwei!=0) sb.append(jinwei);
			return sb.reverse().toString();
		}
	}
	
    public String multiply(String str1,String str2){
    	int len1 = str1.length();
    	int len2 = str2.length();
    	String result = "0";
    	if(len1<len2){              //使得str2指向的字符串为较短的一个字符串
    		String  temp = str1;
    		str1 = str2;
    		str2 = temp;
    		len1 = str1.length();
        	len2 = str2.length();
    	}  
        
    	for(int i=1;i<=len2;i++){
    		String temp = "0";
    		int num = str2.charAt(len2-i) - '0';
    		for(int j=1;j<=num;j++)
    			temp = add(temp,str1);
            
    		for(int k=1;k<=i-1;k++)
    			temp = temp + "0";
    		
    		result = add(result,temp);
    	}
    	
    	return result;
    }
	
	public static void main(String[] args) {
		Multiply mul = new Multiply();
		System.out.println(mul.multiply("8882488", "123888234248888"));
		//使用BigInteger
        java.math.BigInteger  big1 = new java.math.BigInteger("8882488");
        java.math.BigInteger  big2 = new java.math.BigInteger("123888234248888");
        System.out.println(big1.multiply(big2).toString());
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值