Easy

题目描述

一个能被其各位数字之和整除的整数被称为哈沙德数。给定一个整数 x,如果 x 是哈沙德数,则返回 x 的各位数字之和,否则返回 -1。

示例 1:

输入:x = 18

输出:9

解释: x 的各位数字之和是 9。18 能被 9 整除。所以 18 是哈沙德数,答案是 9。

示例 2:

输入:x = 23

输出:-1

解释: x 的各位数字之和是 5。23 不能被 5 整除。所以 23 不是哈沙德数,答案是 -1。

约束条件:

  • 1 <= x <= 100

提示:

  • 使用 while 循环并将 x 除以 10 来求出 x 各位数字的和。

解题思路

解题思路

这道题考查的是基本的数学运算和数位分解。

核心思路:

  1. 首先需要计算给定数字 x 的各位数字之和
  2. 然后判断 x 是否能被这个和整除
  3. 如果能整除,返回数字和;如果不能整除,返回 -1

计算数位和的方法:

  • 使用除法和取模运算:通过 x % 10 获取个位数字,通过 x / 10 去掉个位数字
  • 重复上述过程直到 x 变为 0

算法步骤:

  1. 保存原始的 x 值(因为计算过程中会修改 x)
  2. 通过循环计算各位数字之和
  3. 判断原始值是否能被数位和整除
  4. 根据结果返回相应值

这是一个直接的模拟题,时间复杂度取决于数字的位数。由于约束条件限制 x ≤ 100,最多只有 3 位数,所以效率很高。

代码实现

class Solution {
public:
    int sumOfTheDigitsOfHarshadNumber(int x) {
        int original = x;
        int digitSum = 0;
        
        while (x > 0) {
            digitSum += x % 10;
            x /= 10;
        }
        
        return original % digitSum == 0 ? digitSum : -1;
    }
};
class Solution:
    def sumOfTheDigitsOfHarshadNumber(self, x: int) -> int:
        original = x
        digit_sum = 0
        
        while x > 0:
            digit_sum += x % 10
            x //= 10
        
        return digit_sum if original % digit_sum == 0 else -1
public class Solution {
    public int SumOfTheDigitsOfHarshadNumber(int x) {
        int original = x;
        int digitSum = 0;
        
        while (x > 0) {
            digitSum += x % 10;
            x /= 10;
        }
        
        return original % digitSum == 0 ? digitSum : -1;
    }
}
var sumOfTheDigitsOfHarshadNumber = function(x) {
    let sum = 0;
    let temp = x;
    while (temp > 0) {
        sum += temp % 10;
        temp = Math.floor(temp / 10);
    }
    return x % sum === 0 ? sum : -1;
};

复杂度分析

复杂度类型复杂度说明
时间复杂度O(log x)需要遍历数字的每一位,位数为 log₁₀(x)
空间复杂度O(1)只使用常数额外空间