1281. 整数的各位积和之差
给你一个整数 n
,请你帮忙计算并返回该整数「各位数字之积」
与「各位数字之和」
的差。
示例
输入:n = 234
输出:15
解释:
各位数之积 = 2 * 3 * 4 = 24
各位数之和 = 2 + 3 + 4 = 9
结果 = 24 - 9 = 15
示例
输入:n = 4421
输出:21
解释:
各位数之积 = 4 * 4 * 2 * 1 = 32
各位数之和 = 4 + 4 + 2 + 1 = 11
结果 = 32 - 11 = 21
对于这道题,我首先想到的是通过循环找出各个位,循环首先要知道输入数字的位数。有以下两种方法:
- 方法一:用
Math.log10()
取对数
int number = 12345;
int digits = (int) Math.log10(number) + 1;
System.out.println("整数 " + number + " 的位数为:" + digits);
- 方法二:通过
String.valueOf()
把数值转成字符串
int number = 12345;
String strNumber = String.valueOf(number);
int digits = strNumber.length();
System.out.println("整数 " + number + " 的位数为:" + digits);
我采用方法一,下面是我的代码:
class Solution {
public int subtractProductAndSum(int n) {
int digits = (int) Math.log10(n);
int sum = 0;
int product = 1;
for (int i = digits; i >= 0; i++) {
sum += n / Math.pow(10, i);
product *= n / Math.pow(10, i);
n %= Math.pow(10, i);
}
return (product - sum);
}
}
上述代码运行之后无法通过测试2,也就是输入4421时输出为22。问了GPT之后答案是:
在你的代码中,乘法计算的结果错误是因为你使用了n / Math.pow(10, i)作为乘数,而实际上它们的类型是double,会导致精度丢失。
修改过后的代码如下:
class Solution {
public int subtractProductAndSum(int n) {
int n = 4421;
int sum = 0;
int product = 1;
int digits = (int) Math.log10(n);
for (int i = digits; i >= 0; i--) {
int digit = n / (int) Math.pow(10, i) % 10;
sum += digit;
product *= digit;
}
return (product - sum);
}
}
现在这个代码可以正常通过了