LeetCode_01 精度丢失

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);
    }
}

现在这个代码可以正常通过了

LeetCode_01 精度丢失_第1张图片

你可能感兴趣的:(LeetCode,leetcode,算法)