コードコピーは次のとおりです。
java.io.bufferedreaderをインポートします。
java.io.ioexceptionをインポートします。
java.io.inputStreamReaderをインポートします。
java.util.regex.matcherをインポートします。
java.util.regex.patternをインポートします。
/**
*多数の乗算の簡単な実装はまだそれほど完全ではありません
* 修理:
* 1.変更の前後に0を削除するエラー
* 2。負の数の操作をサポートします
* 3。入力文字列が小数の定義を満たしているかどうかを判断するには、正規表現を使用して判断します
* @author icejoywoo
* @Since 2012.2.16
* @version 0.1.1
*/
パブリッククラスのバイニャーサンバー{
public static void main(string [] args)throws ioexception {
system.out.println( "2つの大きな整数を入力:");
BufferedReader Buffer = new BufferedReader(new inputstreamReader(System.in));
string [] strarray = buffer.readline()。split( "//*");
System.out.println(bignumberMultiply(strarray [0]、strarray [1]));
}
/**
*サイズと精度の2つの数の積を計算する
* @param最初の最初のパラメーター
* @param 2番目のパラメーター
* @return 2つの数字を掛けます
*/
private static string bignumbermultiply(string first、string second){
//ポジティブおよびネガティブサインのサイン
ブールフラグ= false;
if(first.Charat(0)== ' - '){
flag =!flag;
first = first.substring(1);
}
if(second.charat(0)== ' - '){
flag =!flag;
second = second.substring(1);
}
//小数点の位置
int apoints = first.length() - first.indexof( '。')-1;
int bpoints = second.length() - second.indexof( '。')-1;
int pointpos = apoints + bポイント
//小数点を削除します
stringbuffer abuffer = new StringBuffer(first.replaceall( "//。"、 ""));
stringbuffer bbuffer = new StringBuffer(second.replaceall( "//。"、 ""));
int [] a = string2intarray(abuffer.tostring());
int [] b = string2intarray(bbuffer.toString());
int [] result = new int [a.length + b.length -1];
//計算します
for(int i = 0; i <a.length; i ++){
for(int j = 0; j <b.length; j ++){
result [i + j] + = a [i] * b [j];
}
}
//結果の特定のものが9を超える場合、運ぶ必要があります。
for(int i = result.length -1; i> = 0; -i){
if(result [i]> 9){
result [i -1] += result [i] / 10;
result [i] = result [i]%10;
}
}
stringbuffer buffer = new StringBuffer();
for(int i = 0; i <result.length; ++ i){
//小数点を追加します
if(result.length -i == pointpos){
buffer.append( "。");
}
buffer.append(string.valueof(result [i]));
}
if(buffer.indexof( "。")!= -1)
{
//最初の0を削除します
int i = 0;
while(i <buffer.length()){
if(buffer.length()> 2 && buffer.charat(i+1)== '。'){//小数点の前に1つの数値0のみがあります。
壊す;
} else if(buffer.charat(i)== '0'){//最初の0を削除します
buffer.deletecharat(i);
i = 0;
続く;
} else {//最初の位置が0でないとき
壊す;
}
}
//終了0を削除します
i = buffer.length()-1;
while(i> = 0){
if(buffer.length()> 2 && buffer.charat(i-1)== '。'){//小数点は直接数字です
壊す;
} else if(buffer.charat(i)== '0'){//最後に0を削除します
buffer.deletecharat(i);
i = buffer.length()-1;
続く;
} else {//最後のビットが0でないとき
壊す;
}
}
}
//サインビットによると、返品値の正と負のフラグ
if(flag){
return " - " + buffer.toString();
} それ以外 {
return buffer.toString();
}
}
/**
*文字列を配列に置き換えます
* @param番号
* @戻る
*/
private static int [] String2IntArray(String番号){
//入力が浮動小数点番号の要件を満たしているかどうかを判断します
パターンパターン= pattern.compile( "^( - ?// d+| // d*)//.?// d*$");
matcher matcher = pattern.matcher(number);
if(!matcher.find()){
新しいIllegalargumentException( "入力番号が正しくない!")を投げる);
}
int [] result = new int [number.length()];
for(int i = 0; i <number.length(); i ++){
result [i] =(int)(number.charat(i) - '0');
}
返品結果;
}
}
操作結果は次のとおりです。
1。誤った入力の判断
コードコピーは次のとおりです。
2つの大きな整数を入力します。
1a*a22
スレッド「Main」Java.lang.IllegalArgumentExceptionの例外:入力番号が正しくありません!
bignumber.string2intarray(bignumber.java:132)
bignumber.bignumbermultiply(bignumber.java:54)
bignumber.main(bignumber.java:22)
2。負の数の操作、前後に0の操作
コードコピーは次のとおりです。
2つの大きな整数を入力します。
-23424.2300*02345.234000000
-54935300.61982
Pythonの計算結果は次のとおりです
コードコピーは次のとおりです。
Python 2.6.5
>>> -23424.2300*02345.23400000
-54935300.619819999
Pythonの結果が歪んでいることがわかります