所以我在最近的一次采访中被问到了这个问题。有两个数字,非常大,因此它们表示为字符串。现在编写一个函数来乘以它们并得出一个结果字符串。
这是解决方案,我设法提出,但我认为这是一个不可能的问题。
我正在使用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或任何可能的数字类型的范围。
答案 0 :(得分:2)
通常,您可以使用BigInteger
或BigDecimal
来做这样的事情......
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)
。