 
  
 
题目描述
给你一个正整数 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。
 
 
提示:
解法
方法一:模拟
我们可以遍历整数 \(n\) 的每一位数字,计算出数字和 \(s\) 和数字积 \(p\)。最后判断 \(n\) 是否能被 \(s + p\) 整除。
时间复杂度 \(O(\log n)\),其中 \(n\) 为整数 \(n\) 的值。空间复杂度 \(O(1)\)。
|  | 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;
    }
};
 | 
 
|  | 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
}
 | 
 
|  | 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;
}
 |