蓝桥杯考试 分治法 大数乘法

本文介绍了一种使用分治法实现大数乘法的方法。通过将大数拆分成较小的部分,再将这些部分相乘并组合,从而避免了直接使用大数带来的计算复杂度问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个大数字相乘 用JAVA当然可以用BigInteger来算,这里写的是如何用分治法进行运算 

例如123456*654321 可以把两个大数字分别才成两半即123*654 (补6个0)+ 【456*654 +123*321 】(补3个零)+456*321  每次都将大数字拆成两半运算后加起来(调用大数的加法)

import java.math.BigInteger;

public class _6_分治_03大数乘法 {

	public static String BigAdd(String a,String b)	//大数的加法 注意进位
	{
		char[]tempa = a.toCharArray();
		char[]tempb = b.toCharArray();
		int sumlong = tempa.length>=tempb.length?tempa.length:tempb.length; //用数组来存大数字,满10进1
		int[] aa = new int[sumlong];
		int[] bb = new int[sumlong];
		int La = 0 , Lb=0;
		if(tempa.length>=tempb.length)	//a大于b b的前面补零
		{
			La = 0;
			Lb=tempa.length-tempb.length;
			for(int i=0;i<Lb;i++)
			{
				bb[i]=0;
			}
		}
		else
		{
			Lb = 0;
			La=tempb.length-tempa.length;
			for(int i=0;i<La;i++)
			{
				aa[i]=0;
			}
		}		
		for(int i=La;i<sumlong;i++)	//读入数据
		{
				aa[i]=tempa[i-La]-48;
		}
		for(int i=Lb;i<sumlong;i++)
		{
				bb[i]=tempb[i-Lb]-48;
		}
		
		int le = aa.length>bb.length?bb.length:aa.length;	//找小的那个
		int[] F = new int[le+1];	//新建最终数组 防止进位越界 直接设置+1的长度
		
		for(int i=aa.length-1;i>=0;i--)		//从后开始运算
		{
			int t = aa[i]+bb[i];
			if(t>=10)
			{
				t-=10;
				F[i]++;
			}
			F[i+1]+=t;
			if(F[i+1]>=10)
			{
				F[i]++;
				F[i+1]-=10;
			}
		}
		String s ="";
		for(int i=0;i<F.length;i++)
		{
			if(i==0&&F[i]==0)	//第一位要是为0不写入s
				continue;
			s+=F[i];
		}
		return s;	
	}
	
	
	
	public static String muti(String a,String b)
	{
		
		if(a.length()<=3&&b.length()<=3)		//长度小的时候直接调用乘法
			return Integer.parseInt(a)*Integer.parseInt(b)+"";
		else
		{
			int k1 = a.length()/2;
			String aa1 = a.substring(0,k1);//+aa2.length的0 
			String aa2 = a.substring(k1);
			int La= aa2.length();
			
			int k2 = b.length()/2;
			String bb1 = b.substring(0,k2);//+bb2.length的0
			String bb2 = b.substring(k2);
			int Lb= bb2.length();
			
			//共4部分分 需要补0的地方各自补0
			String temp1 = muti(aa1,bb1);
			for(int i=0;i<La+Lb;i++)
			{
				temp1+="0";
			}
			
			String temp2 = muti(aa1,bb2);
			for(int i=0;i<La;i++)
			{
				temp2+="0";
			}
			String temp3 = muti(aa2,bb1);
			for(int i=0;i<Lb;i++)
			{
				temp3+="0";
			}
			String temp4 = muti(aa2,bb2);
			
			//四部分相加
			String t1 = BigAdd(temp1,temp2);
			String t2 = BigAdd(temp3,temp4);
			String t3 = BigAdd(t1,t2);
			return t3;
		}
	}

	public static void main(String[] args) {
		for(int i=0;i<10;i++)
		{
			String a = (int)(Math.random()*1000000000)+"";
			String b = (int)(Math.random()*1000000000)+"";
			System.out.println(muti(b,a).equals(new BigInteger(a).multiply(new BigInteger(b))+"")+"\n");
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值