2017-06-18 57 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

也可以做俄罗斯农民增殖。 –