如何乘以作为字符串输入的两个100位数字。 注意:我们不允许使用BigInteger或BigDecimal类的java。非常大的数字产品
Q
非常大的数字产品
-5
A
回答
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
也可以做俄罗斯农民增殖。 –
相关问题
- 1. PHP/mySQL产品系统(非常一般)
- 2. Magento 1.9.1 - 保存产品非常慢
- 3. 使用CUDA计算(非常)大型矩阵产品
- 4. 函数用于乘以非常小或非常大的数字
- 5. 由标量opencv矩阵划分产生非常大/小数字
- 6. Exponentiate非常大的数字中的R
- 7. 最大的产品
- 8. C++ - 一个非常非常大的数字
- 9. 使用大产品的产品ID获取产品sku在Magento
- 10. 查找非常大的数字
- 11. 增加非常大的数字在VB.NET
- 12. C++中功耗非常大的数字
- 13. decimal.InvalidOperation,DivisionImpossible非常大的数字
- 14. 显示非常大的数字,用byte []
- 15. 处理非常大的数字
- 16. 如何排序非常大的数字
- 17. BigDecimal.movePointRight()挂起非常大的数字
- 18. Streamtokenizer读取非常大的数字?
- 19. vb.net中非常大的数字
- 20. 具有固定的最大产品数量的清单产品
- 21. 输入数字的产品
- 22. Numpy dot产品非常缓慢地使用整数
- 23. 用于非常大型数据的XMLSerializer的替代品
- 24. 本身划分浮点数产生非常大的整数
- 25. 寻找两个非常大的数字乘以一个非常大的数字的模数
- 26. Magento后端非常缓慢打开产品时,大量的价格增加
- 27. Python:数字范围非常大?
- 28. 非默认存储的可配置产品的产品名称
- 29. 非常大在一个非常大的B分数
- 30. 算法为大数非常大的数字(C++)
提示:位或字符串 –
坦白? [计算机程序设计艺术(http://www-cs-faculty.stanford.edu/~uno/taocp.html),第2卷,第4.3节 – dhke