跳转至

3622. 判断整除性

题目描述

给你一个正整数 n。请判断 n 是否可以被以下两值之和 整除

  • n 的 数字和(即其各个位数之和)。

  • n 的 数字积(即其各个位数之积)。

如果 n 能被该和整除,返回 true;否则,返回 false

 

示例 1:

输入: n = 99

输出: true

解释:

因为 99 可以被其数字和 (9 + 9 = 18) 与数字积 (9 * 9 = 81) 之和 (18 + 81 = 99) 整除,因此输出为 true。

示例 2:

输入: n = 23

输出: false

解释:

因为 23 无法被其数字和 (2 + 3 = 5) 与数字积 (2 * 3 = 6) 之和 (5 + 6 = 11) 整除,因此输出为 false。

 

提示:

  • 1 <= n <= 106

解法

方法一:模拟

我们可以遍历整数 \(n\) 的每一位数字,计算出数字和 \(s\) 和数字积 \(p\)。最后判断 \(n\) 是否能被 \(s + p\) 整除。

时间复杂度 \(O(\log n)\),其中 \(n\) 为整数 \(n\) 的值。空间复杂度 \(O(1)\)

1
2
3
4
5
6
7
8
9
class Solution:
    def checkDivisibility(self, n: int) -> bool:
        s, p = 0, 1
        x = n
        while x:
            x, v = divmod(x, 10)
            s += v
            p *= v
        return n % (s + p) == 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class Solution {
    public boolean checkDivisibility(int n) {
        int s = 0, p = 1;
        int x = n;
        while (x != 0) {
            int v = x % 10;
            x /= 10;
            s += v;
            p *= v;
        }
        return n % (s + p) == 0;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Solution {
public:
    bool checkDivisibility(int n) {
        int s = 0, p = 1;
        int x = n;
        while (x != 0) {
            int v = x % 10;
            x /= 10;
            s += v;
            p *= v;
        }
        return n % (s + p) == 0;
    }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func checkDivisibility(n int) bool {
    s, p := 0, 1
    x := n
    for x != 0 {
        v := x % 10
        x /= 10
        s += v
        p *= v
    }
    return n%(s+p) == 0
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
function checkDivisibility(n: number): boolean {
    let [s, p] = [0, 1];
    let x = n;
    while (x !== 0) {
        const v = x % 10;
        x = Math.floor(x / 10);
        s += v;
        p *= v;
    }
    return n % (s + p) === 0;
}

评论