JAva大数乗算アルゴリズム


準備フェーズ:
整数配列を用意する特別な説明がない場合、以下に示す配列は、str 1とstr 2の2つの文字列の次元数の和(2つの数が乗算され、その積の桁数は2つの乗数の和より大きくない)を指す.str 1とstr 2の長さを事前に知ることができなかったため、この配列Åを動的メモリ割り当てで定義するにはarrと記す.この配列の役割は、2つの大きな数の乗算を保存するための結果Åであり、各配列要素に1つの整数Åが格納され、この整数は0~9の間の整数である.初期状態は0に設定されています.
演算手順:
大きな数の乗算が行われる場合、Åは、従来の計算方法、すなわち、数の最下位から順に被乗数に乗算され、次いで結果が順次加算される.最終結果を得るには、複数回の乗算と加算の演算が必要であることは明らかである.
第一次乗算
乗数str 2の末尾ビットbnは、乗数のあるビットと被乗数のすべてのビットとを順次乗じ、結果を対応する処理を行った後のプロセスを意味する.1≦k≦mÅの場合、c[k]≧10Åの場合、c[k+1]=c[k+1]+c[k]/10Åのc[k]=c[k]%10Åというプロセスを配列の再構成と呼ぶように、ビットを上げる必要がある.
2回目の乗算が行われると、ビット乗数str 2の最後から2番目のビットb[n−1]と被乗数の各ビットとのビット乗数の結果は、配列arr中のattr[2]~attr[m+1]の要素に順次ビットを加算し、対応する配列要素のビットを修正し、必要に応じて配列の再構成を行う.このようにして、n回目の乗算が完了した後の列arrに格納されたデータは、最終結果の列が逆順序の列にすぎない、すなわち、最上位の列が後の列のビットで前の列にある場合、結果の列を逆転させ、上位の0の要素を除去する.最後に各配列要素の値を順次出力すればよい
Javaの具体的なコードで実装します.
import java.util.Arrays;

public class BigNumberMultiplication {

	/**
	 *       
	 *         ,           ,         ,             ,                 ;(             )
	 *              ,   10     ;
	 *              ,           0      ,                。
	 * @param str1	   
	 * @param str2	  
	 * @return             
	 */
	public int[] calculateMulti(int[] str1,int[] str2){
		int[] resultArr = new int[str1.length+str2.length];//                    
		int offset =0;//             ,          
		for(int i=str2.length-1;i>=0;i--){
			//             ,                   
			for(int j=str1.length-1;j>=0;j--){
				resultArr[offset+str2.length-1-j]+=str2[i]*str1[j];
			}
			//    
			rebulidResultArr(resultArr,offset,str1.length);
			offset++;
		}
		convertResultArr(resultArr);
		//      0     
		boolean isBegin= false;
		for(int i=0;i<resultArr.length;i++){
			if(!isBegin&&resultArr[i]>0){
				isBegin = true;
				resultArr = Arrays.copyOfRange(resultArr, i, resultArr.length);
				break;
			}
		}
		return resultArr;
	}

	/**
	 *       ,            10,    10    
	 * @param resultArr	      
	 * @param offset	       ,                
	 * @param length	       ,          。
	 */
	private void rebulidResultArr(int[] resultArr, int offset, int length) {
		int i= offset;
		while(i<offset+length){
			if(resultArr[i]>10){
				resultArr[i+1] += resultArr[i]/10;
				resultArr[i] %= 10;
			}
			i++;
		}
	}
	/**
	 *     ,          
	 * @param resultArr	      
	 */
	private void convertResultArr(int[] resultArr){
		int i=0,j=resultArr.length-1,temp = 0;
		while(i<j){
			temp = resultArr[i];
			resultArr[i]=resultArr[j];
			resultArr[j]=temp;
			i++;
			j--;
		}
	}
	/**
	 *        
	 * @param resultArr	       
	 */
	public void printResultArr(int[] resultArr){
		for(int i=0;i<resultArr.length;i++){
			System.out.print(resultArr[i]);
		}
	}
	
	public static void main(String[] args) {
		BigNumberMultiplication test= new BigNumberMultiplication();
		int[] str =new int[20];
		for(int i=0;i<str.length;i++){
			str[i]=(i+1)%10;
			System.out.print(str[i]);
		}
		System.out.println();
		int[] resuleArr = test.calculateMulti(str, str);
		test.printResultArr(resuleArr);
		
	}
	
	
}