大數乘法(最基本方法)

最基礎的方法,模擬豎式計算過程求結果。沒有優化。受限於數組及內存上限。

代碼如下:

import java.util.ArrayList;
import java.util.List;

public class Testd {
 public static void main(String[] args) throws Exception{
  String res = getPlus("99999","99999");
  System.out.println(res);
 }
 /**
  * 大數乘法
  * @param a 乘數
  * @param b 被乘數
  * @return
  * @throws Exception
  */
 public static String getPlus(String a, String b) throws Exception{
  String result="";
  char aarr[] = a.toCharArray();
  char barr[] = b.toCharArray();
  String add[][] = new String[b.length()][a.length()+b.length()];//豎式計算過程中的數字
  for (int i=0; i<b.length(); i++){
   String be=""+barr[b.length()-i-1];
   for (int j=0; j<a.length(); j++){
    String ae=""+aarr[a.length()-j-1];
    String sube=String.valueOf(Integer.parseInt(ae)*Integer.parseInt(be));
    if (add[i][a.length()+b.length()-j-1-i]==null||"".equals(add[i][a.length()+b.length()-j-1-i])){
     add[i][a.length()+b.length()-j-1-i]="0";
    }

    //按位乘法
    add[i][a.length()+b.length()-j-1-i]=String.valueOf(
      Integer.parseInt(add[i][a.length()+b.length()-j-1-i])
      +Integer.parseInt(sube.substring(sube.length()-1,sube.length())));
    if (sube.length()>1){
     add[i][a.length()+b.length()-j-2-i]=sube.substring(0,1);
    }else{
     add[i][a.length()+b.length()-j-2-i]="0";
    }
   }
  }
  int maxl=a.length()+b.length();
  List<Integer> reList = new ArrayList<Integer>();

  //對豎式中間結果求和
  for (int si=0;si<maxl;si++){
   int ts=0;
   for (int sj=0;sj<b.length();sj++){
    if (add[sj][maxl-si-1]!=null&&!"".equals(add[sj][maxl-si-1])){
     ts+=Integer.parseInt(add[sj][maxl-si-1]);
    }
   }
   String tsstr=String.valueOf(ts);
   char tsarr[]=tsstr.toCharArray();
   while(reList.size()<(si+tsarr.length)){
    reList.add(0);
   }
   int adding=0;

   //處理求和中產生的進位
   for (int tssi=0; tssi<tsarr.length; tssi++){
    int tmps=reList.get(si+tssi)+Integer.parseInt(""+tsarr[tsarr.length-tssi-1])+adding;
    reList.set(si+tssi, tmps%10);
    adding=tmps/10;
   }
   if (adding!=0){
    reList.add(adding);
   }
  }

  //合併求和結果
 int reben=reList.size()-1;

 //去除開始部分的0
  while (reList.get(reben)==0){
   reben--;
  }
  for (int rei=reben;rei>=0;rei--){
   result+=reList.get(rei);
  }  return result;
 }
}

以上代碼是JAVA版本,使用的是基本類型,可以很容易改成C語言(或相似語法的)代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章