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 各位数字的和。
解题思路
解题思路
这道题考查的是基本的数学运算和数位分解。
核心思路:
- 首先需要计算给定数字 x 的各位数字之和
- 然后判断 x 是否能被这个和整除
- 如果能整除,返回数字和;如果不能整除,返回 -1
计算数位和的方法:
- 使用除法和取模运算:通过
x % 10获取个位数字,通过x / 10去掉个位数字 - 重复上述过程直到 x 变为 0
算法步骤:
- 保存原始的 x 值(因为计算过程中会修改 x)
- 通过循环计算各位数字之和
- 判断原始值是否能被数位和整除
- 根据结果返回相应值
这是一个直接的模拟题,时间复杂度取决于数字的位数。由于约束条件限制 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) | 只使用常数额外空间 |