海豚实习-实现两个大数相乘

28 篇文章 2 订阅

   问题描述:定义大数d为一个数组,表示为:d=a[k-1]*10^(k-1)+a[k-2]*10^(k-2)+...+a[1]*10+a[0](k为数组长度),实现一个函数,返回两个大数相乘的结果

   /**

     d1=a[k-1]*10^(k-1)+a[k-2]*10^(k-2)+...+a[1]*10+a[0]  

    d2=b[l-1]*10^(l-1)+b[l-2]*10^(l-2)+...+b[1]*10+b[0]

    d1*d2 包含k*l项,这只是没有合并的

    每一项可以表示为:d*10^x,然后将(x,d)放在map中,很多实现方法都是直接新生成一个 c[k*l]的数组来保存,但是如果数组过大容易造成内存泄漏,像在java 中,常量池是根据JVM设置的,随便搞个c[k*l]很容易溢出。所以还是搞个hashmap比较好。。。

*/

用java实现的代码如下:

public static int[] bigDataMultiply(int[]d1,int []d2)
	{
		//int []d=new int[100];
		Map<Integer, Integer> map=new HashMap<Integer, Integer>();
		for(int i=0;i<d1.length;i++)
			for(int j=0;j<d2.length;j++)
			{
				if(map.containsKey(i+j))
				{
					map.put(i+j, map.get(i+j)+d1[d1.length-i-1]*d2[d2.length-j-1]);
				}
				else {
					map.put(i+j, d1[d1.length-i-1]*d2[d2.length-j-1]);
				}
			}
		//然后遍历整个map,将一些数据分解合并
		//map中的可以是按照从小到达排列的
		for(int i=0;i<d1.length+d2.length;i++)
		{
			if(map.containsKey(i))
			{
				//将d值分解
				int temp=map.get(i);
				map.put(i,temp%10);
				int j=0;
				while((temp/=10)>0)//大数相乘,并不一定相加只有两位数,所以这里要用一个循环
				{				
					j++;
					map.put(i+j, map.containsKey(i+j)?(map.get(i+j)+temp%10):temp%10);
				}
			}
		}
		int []d=new int [map.size()];
		for(Integer k:map.keySet())
		{
			d[map.size()-k-1]=map.get(k);
		}
		return d;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值