海豚實習-實現兩個大數相乘,海豚實習大數相乘
問題描述:定義大數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;}