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);
    }
}
现在这个代码可以正常通过了




















