2017-06-18 59 views
-5

如何乘以作爲字符串輸入的兩個100位數字。 注意:我們不允許使用BigInteger或BigDecimal類的java。非常大的數字產品

+0

提示:位或字符串 –

+0

坦白? [計算機程序設計藝術(http://www-cs-faculty.stanford.edu/~uno/taocp.html),第2卷,第4.3節 – dhke

回答

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

也可以做俄羅斯農民增殖。 –