如何将两个100位数字相乘,这些数字作为字符串输入。 注意:我们不允许使用java的BigInteger或BigDecimal类。
答案 0 :(得分: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
值。
请注意,如果您已经学过如何执行快速二进制操作的课程,则可能需要复制该操作而不是上面的答案。