给定两个表示为字符串的非负数num1和num2,返回num1和num2之和。
num1和num2的长度都小于5100。
num1和num2都只包含数字0-9。
num1和num2都不包含任何前导零。
不能使用任何内置的biginteger库或直接将输入转换为整数。
我试过我的解决办法,但没用。建议?
public class Solution {
public String addStrings(String num1, String num2) {
double multiplier = Math.pow(10, num1.length() - 1);
int sum = 0;
for (int i = 0; i < num1.length(); i++){
sum += ((((int) num1.charAt(i)) - 48) * multiplier);
multiplier /= 10;
}
multiplier = Math.pow(10, num2.length() - 1);
for (int i = 0; i < num2.length(); i++){
sum += ((((int) num2.charAt(i)) - 48) * multiplier);
multiplier /= 10;
}
return "" + sum;
}
}
7条答案
按热度按时间4jb9z9bj1#
不能使用任何内置的biginteger库或直接将输入转换为整数。
请注意,您要添加两个整数,每个整数最多5100位。这不是最大值,而是最大位数。
一
int
(您的sum
变量)不能保存这样的值。BigInteger
可以,但你不能用。所以,像在纸上一样加上数字:加上最后一个数字,写下和的下一个数字作为结果的最后一个数字,如果需要,再加上一个。重复倒数第二位、倒数第三位等直到完成。
由于总和将至少是最长输入值的位数,并且可能更长,因此您应该分配一个
char[]
最长输入长度加1。完成后,使用String(char[] value, int offset, int count)
,根据需要偏移0或1。7gcisfzg2#
这个问题的目的是把数字以字符串形式加起来。不应尝试将字符串转换为整数。描述说,这些数字的长度可能高达5100位。所以数字太大了,不能存储在整数和双精度中。例如,在以下行中:
您正在尝试将10^5100存储在
double
. 在ieee754二进制浮点标准中double
你能给我一个商店号码吗±4.94065645841246544e-324
至±1.79769313486231570e+308
. 所以你的号码不合适。反而会变成Infinity
. 即使它适合double
这将是不准确的,你会遇到一些错误,在你的后续计算。因为问题指定不使用biginteger或类似的库,所以您应该自己尝试实现字符串加法。
这很简单,只要实现在纸上添加两个数字时所遵循的精确算法即可。
nr7wwzry3#
下面是添加两个字符串而不使用
BigInteger
使用char数组作为中间容器。关键是为什么double
@tempux answer上解释了不能使用。这里的逻辑类似于在纸上加两个数字。这个片段相对较小且精确,因为这里我没有使用immutable
String
这是复杂的/混乱的,并且产生更大的代码。还有一个直觉是——没有办法获得比这更大的产出max(num1_length, num2_length) + 1
这使得实现变得简单。ojsjcaue4#
你必须像写在纸上一样写加法
不能使用biginteger和字符串长度5100,因此不能使用int或long进行加法。你必须像我们在纸上做的那样使用简单的加法。
您可以运行上面的代码并看到它在所有情况下都能工作,这可以用更简洁的方式编写,但这对您来说很难理解。
希望有帮助!
ar5n3qh55#
以前的解决方案有多余的代码。这就是你所需要的。
mwecs4sa6#
您可以使用独立于integer或biginteger方法的方法
n1bvdmb67#
为了理解这个问题
方法的名称是addition
您正试图执行幂运算,但结果存储在名为乘法的变量中。。。
代码不起作用的原因不止一个。。。
你需要做一些像
为了把字符串解析成整数
这是官方文件