2011-07-03 14 views
8

非常に大きな乗算の桁数(それぞれ約300桁)を見つける必要があります。私は実際に計算を実行せずに製品が桁数を予測するというトリックがあるのだろうかと思っていました。次のように乗算の桁数を予測する

+0

などの他の塩基についても同様です。 – cristobalito

+1

次のように桁数を指定できます: 'floor(log x)* floor(log y)<=数字(x * y)<= ceil(log x)* ceil(log y)' log base 10. – davin

+0

@critobalito it more n + mここで、nとmは各式の桁数です。例えば'9 * 9 = 81'' 999 * 9 = 8991' – Lynch

答えて

22

桁数は、2つの被乗数のbase 10 logプラス1の丸め(ダウン)合計によって正確を計算することができる。

public static void main(String[] args) { 
    DecimalFormat f = new DecimalFormat("#"); 
    double num1 = 123456789d; 
    double num2 = 314159265358979d; 

    // Here's the line that does the work: 
    int numberOfDigits = (int) (Math.log10(num1) + Math.log10(num2)) + 1; 

    System.out.println(f.format(num1) + " * " + f.format(num2) + " = " + 
     f.format((num1 * num2)) + ", which has " + numberOfDigits + " digits"); 
} 

出力:

123456789* 314159265358979 = 3878509413969699000000000000000000, which has 34 digits 

これは、任意に大きな数値で動作します。

+0

これは私の答えよりもはるかに優れています:) – Tom

+0

あなたの応答のために多くの皆さん、ありがとうが、これはケーキを取る。ありがとう。 – Deho

+2

もちろん、10進数*が必要な場合は 'log10'だけです。より一般的には、もし我々が基底-k定位システムの数字を必要とするならば 'log_k'です。 –

6

クリストバリトの答えがかなり得られます。 「約」をより正確にしてみましょう。

最初の数字がn桁で、2番目の数字がmであるとします。それらの最小値はそれぞれ10 ^(n-1)と10 ^(m-1)です。その製品は可能な限り低く、10 ^(m + n-2)であり、これはm + n-1桁である。

最高値はそれぞれ10^n - 1と10^m - 1です。その製品は最高になり、10 ^(n + m)-10^n - 10^m + 1で、これは最大でm + n桁です。

したがって、n桁の数字にm桁の数字を掛けると、m + n-1またはm + nの数字が表示されます。

同様のロジックは、それが一般的に、nは桁数は約2×n個、例えばだベース2

+0

他のポスターが記述している底10の対数は、簡単な技術。しかし、基底2の対数を見つけ、(log 2)/(log 10)を掛けることができます。これは約0.693です。基本2の対数は、バイナリ表現で最も重要な1の位置を見つけるだけで浮動小数点に頼らずに見つけることができます。その後、69を掛けて100で除算すると、整数演算以外の何も使用せずにおおよその桁数を見つけることができます。おそらく実際にはこのようなことはしてはいけません。なぜなら、おそらく実際には問題の価値があることはありません。かわいい、でも、いいえ? –

+0

ここにあなたのコメントを答えに加えてみませんか? –

+0

私は実際には本当に役に立つとは思わないので、 –