数字的字符串表示形式

时间:2016-01-18 20:59:03

标签: java

所以我在最近的一次采访中被问到了这个问题。有两个数字,非常大,因此它们表示为字符串。现在编写一个函数来乘以它们并得出一个结果字符串。

这是解决方案,我设法提出,但我认为这是一个不可能的问题。

我正在使用Integer

public String multiply(String str1, String str2){
     int count = 0;
     for(int i=0; i < str1.length(); i++){
       int num1 = Integer.parseInt(str1.substring(str1.length()-2 -i, str2.length()-1-i));
        for(int j=0; j < str2.length(); j++){
         int num2 = Integer.parseInt(str2.substring(str2.length()-1 -j, str2.length()-1);
          count+= num1*num2;
        }
     }
   return String.valueOf(count);
}

但是,我觉得因为问题的前提是两个字符串的数值不能存储在变量中,所以变量count也会溢出。因此,我认为我的解决方案不正确。有没有办法做到这一点。这些数字超出了Long或任何可能的数字类型的范围。

6 个答案:

答案 0 :(得分:2)

通常,您可以使用BigIntegerBigDecimal来做这样的事情......

final String number1 = "12345678902374287346293649376492342...";
final String number2 = "12345678902374287346293649376492342...";
final BigDecimal result = new BigDecimal(number1).multiply(new BigDecimal(number2));
System.out.println("Huge Number: " + result);

答案 1 :(得分:1)

“大整数”的问题很好地由许多编程语言和库处理,例如BigInteger class。就自己实施而言,根据您的需求(例如计算效率与存储效率),有不同的方法来解决问题。

基本思想是将算术分解为可管理的块,就像你在学校学到的算术一样。如果您将数字以十进制形式存储为一串数字,那么您只需从最低有效数字(可能是右端)开始逐位进行十进制乘法运算。如果任何数字乘法的结果是10或更多,则携带额外的十(s)并将其添加到下一个数字的计算中。

这里有一些示例实现:An interview question - implement Biginteger Multiply

答案 2 :(得分:0)

使用BigDecimal乘法方法,而不是这个问题的简单答案。

请参阅https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

答案 3 :(得分:0)

您可以按照@svasa提供的评论,而不是使用BigDecimal。 您应该将计数视为String

根据我的经验,他们希望您实现乘法算法,就像您在小学教授的那样。

答案 4 :(得分:0)

“手动”方法的复杂度为O(N ^ 2)。更好的方法是使用奇异的算法,例如https://en.wikipedia.org/wiki/Karatsuba_algorithm,或者查看基类库中的现有类(java / C#或其他类似的东西,如BigInteger)

答案 5 :(得分:0)

他们想要String,这是间接的,但你可以分解,直到他们失去兴趣。

String multiply(String x, String y) {
    String sum = "0";
    String pow10 = "";
    for (int i = 0; i < x.length(); ++i) {
        char digit = x.charAt(x.length() - 1 - i);
        String term = multiplyDigit(digit, y);
        sum = add(sum, term + pow10);
        pow10 += "0";
    }
    return sum;
}

依此类推:add,multiplyDigit。

数据的选择:字符数组,可能是数字值(字节),StringBuilder(灵活长度)顺序等对于这里的快速实现(在java中)实际上没有用。

你可以通过简化来避免自己的麻烦:

String multiplyDigit(char c, String x) {
    String carries = "0";
    String term = "";

    int cvalue = c - '0';
    for (int i = 0; i < x.length(); ++i) {
        char digit = x.charAt(x.length() - 1 - i);

        int product = cvalue * (digit - '0');
        char carry = (char)('0' + (product / 10));
        char t = (char)('0' + (product % 10));
        carries = carry + carries;
        term = t + term; 
    }
    return add(carries, term);
}

你不立即添加进位,但重用add(String, String)