gpt4 book ai didi

java - java中数字串相乘

转载 作者:行者123 更新时间:2023-12-05 00:39:01 25 4
gpt4 key购买 nike

我是编程初学者,我一直在做 Project Euler编程问题练习,到目前为止我已经能够成功,但是这次我不得不寻求帮助。在没有剧透的情况下,我试图解决的问题包括找到一个非常大的数字的数字之和,所以我不能将它保存在 int 或 double 中。所以我创建了这个方法来将两个包含数值的字符串相乘。

    private static String multiply(String a, String b) {

// No, I'm not checking if the strings are numeric

int subTotal = 1, extra = 0;

String waitingString = "";
StringBuilder number1 = new StringBuilder(a);
StringBuilder number2 = new StringBuilder(b);
List<String> numbers = new ArrayList<String>();
// The reason I reverse the numbers is the for() loops
// I don't want to count down through the numbers, that
// would just confuse me more.
number1.reverse();
number2.reverse();

for (int i = 0; i < number1.length(); i++) {

waitingString = "";
subTotal = Character.getNumericValue(number1.charAt(i));

for (int j = 0; j < number2.length(); j++) {

subTotal *= Character.getNumericValue(number2.charAt(j));
subTotal += extra;

char[] temp = String.valueOf(subTotal).toCharArray();
waitingString = temp[temp.length - 1] + waitingString;

if (subTotal >= 10 || ((j == number2.length() - 1) && (String.valueOf(subTotal).length() > 1))) {

extra = Integer.parseInt(String.valueOf(subTotal).substring(0, temp.length - 1));

} else {

extra = 0;

}

subTotal = Character.getNumericValue(number1.charAt(i));

}

for (int k = 0; k < i; k++) {
waitingString += "0";
}

waitingString = extra + "" + waitingString;

numbers.add(waitingString);

}

// sumAll() is not the problem just in case you were wondering.
// Because as you've read the code, I'm passing a List<String>
// to it and as I was trying to find the error I printed the list
// before everything to check the values and the error was already
// there, 3 of the values are wrong.
return sumAll(numbers);
}

测试时,我将这个数字与其本身相乘:1125899906842624。结果应该是1267650600228229401496703205376。但是我得到1267650600228229401607703205376。相差111000000 000.我两天来一直试图找到错误,但我只是不能。我并不是在寻找替代或更好的方法来执行此操作,我只是在代码中找不到添加超出应有内容的错误。如果您需要查看其余代码,我可以提供,请不要介意拼写/语法错误,英语不是我的母语。

最佳答案

无需尝试运行它或在调试器下查看它:看起来您正在设置一个额外变量,它是一个进位,即应该添加到下一个产品的值当您向左移动时(以原始数字,而不是相反的数字)。我发现的一个问题是,如果内循环中的最后乘积产生大于或等于 10 的值,则需要计算额外;但当您进入下一个外部循环时,extra仍然具有该值,并且在不应该的情况下被添加到subTotal中。尝试在外循环的开头和内循环开始之前添加语句 extra = 0;。这可能会解决问题。

附注通过将 subTotal 表示为字符串并使用它,您会为自己做很多额外的工作。虽然我理解为什么您想要对两个被乘数和乘积使用字符串,但 subTotal 是两个个位数加上进位的乘积,并且它永远不会大于 89。所以您永远不必将其转换为字符串并使用该字符串。因此,而不是

char[] temp = String.valueOf(subTotal).toCharArray();
waitingString = temp[temp.length - 1] + waitingString;

你可以说

waitingString = String.valueOf(subTotal % 10) + waitingString;

或类似的东西(subTotal % 10给出subTotal除以10时的余数,因此是subTotal的最后一位数字);而不是使用复杂的代码来计算额外,只需说

extra = subTotal / 10;

除以 10 并丢弃余数。您根本不应该计算 String.valueOf(subTotal)

PPS。不要担心告诉您使用 BigInteger 的答案。如果您正在做一个真正的编程项目,那么您就会使用它。但对于学习如何编程的人来说,我认为编写一个程序来计算两个数字的乘积,从长远来看,是一个很好的学习工具。

关于java - java中数字串相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20794341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com