2017-06-18 12 views
-5

文字列として入力された2つの100桁の数字を乗算する方法。 注:BigIntegerクラスまたはBigDecimalクラスのjavaは使用できません。非常に大量の製品

+0

ヒント:ビットまたは文字列 –

+0

率直に言って、 [コンピュータプログラミングの技術](http://www-cs-faculty.stanford.edu/~uno/taocp.html)、第2巻、セクション4.3 – dhke

答えて

2

あなたができることは、高校で学んだ方法を乗算することです。したがって、2番目の数字の最下位桁を取り、最初の数字よりも上に向かって繰り返してから、2番目の数字を入力して、合計を得るまで結果を加算します。基本的には、通常あなたが手で行うことを自動化するだけです。

これを行う方法の例を示すと、私はこれらの種類の質問がプログラマーの初心者にとって非常に難しいと感じるので、次のコードを示すことができます。それは良いプログラムの構成とタスクを完了するために必要な技術の多くを示す必要があります。

もちろん、実装は非常に欠けています:)。

public class DecimalNumber { 

    public static String multiply(String x, String y) { 
     String intermediateResult = "0"; 
     for (int i = 0; i < y.length(); i++) { 
      char ydc = y.charAt(y.length() - i - 1); 
      int yd = toDigitValue(ydc); 
      String result = multiply(yd, x); 
      String shiftedResult = shift(i, result); 
      intermediateResult = add(intermediateResult, shiftedResult); 
     } 
     return intermediateResult; 
    } 

    private static String add(String x, String y) { 
     int digitsToAdd = Math.max(x.length(), y.length()); 
     StringBuilder result = new StringBuilder(1 + digitsToAdd); 

     int carry = 0; 
     for (int i = 0; i < digitsToAdd; i++) { 
      int xd; 
      if (i >= x.length()) { 
       xd = 0; 
      } else { 
       char xdc = x.charAt(x.length() - i - 1); 
       xd = toDigitValue(xdc); 
      } 

      int yd; 
      if (i >= y.length()) { 
       yd = 0; 
      } else { 
       char ydc = y.charAt(y.length() - i - 1); 
       yd = toDigitValue(ydc); 
      } 

      int digitAdd = xd + yd + carry; 
      if (digitAdd >= 10) { 
       carry = digitAdd/10; 
       digitAdd = digitAdd % 10; 
      } else { 
       carry = 0; 
      } 
      char digitMulChar = toDigitCharacter(digitAdd); 
      result.insert(0, digitMulChar); 
     } 
     if (carry != 0) { 
      result.insert(0, carry); 
     } 
     return result.toString(); 
    } 

    private static String shift(int shift, String valueToShift) { 
     StringBuilder result = new StringBuilder(valueToShift.length() + shift); 
     result.append(valueToShift); 
     for (int i = 0; i < shift; i++) { 
      result.append('0'); 
     } 
     return result.toString(); 
    } 

    private static String multiply(int yd, String x) { 
     // TODO implement 
     throw new IllegalStateException("Method not implemented"); 
    } 

    private static int toDigitValue(char digitAsCharacter) { 
     return Integer.parseInt("" + digitAsCharacter); 
    } 

    private static char toDigitCharacter(int digitValue) { 
     return Character.forDigit(digitValue, 10); 
    } 

    public static void main(String[] args) { 
     System.out.println(multiply("999", "999")); 
    } 
} 

私は実際に一度ソフトウェアでこの種のコードを発見しました。しないでください。バイト単位で動作する大きな整数ライブラリを使用してください。また、パフォーマンスが必要な場合は、64ビットのlongの値を使用します。


すでに高速バイナリ操作の実行方法に関するレッスンがある場合は、おそらく上記の回答よりも複製する必要があることに注意してください。

+0

この質問の考え方は、実生活ですでに解決している問題を、コンピュータでうまくいくソリューションに変換します。次回は、これらの質問の1つを取得して、あなたがすでに持っている知識に論理を適用してみてください。 –

+1

ロシアの農民の繁殖もできます。 –

関連する問題