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の具体的なコードで実装します.
整数配列を用意する特別な説明がない場合、以下に示す配列は、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);
}
}