Easy
题目描述
给你一个十进制数 n 和一个进制 k,请你将 n 从十进制转换为 k 进制,并求转换后各位数字的和。
转换后,每一位数字都应当视作十进制数字,求和结果也应当按十进制返回。
示例 1:
输入:n = 34, k = 6
输出:9
解释:34(十进制)在六进制下是 54。5 + 4 = 9
示例 2:
输入:n = 10, k = 10
输出:1
解释:n 本身就是十进制的。1 + 0 = 1
提示:
1 <= n <= 1002 <= k <= 10
解题思路
解题思路
这道题要求我们将十进制数 n 转换为 k 进制,然后计算转换后各位数字的和。
核心思路:进制转换
要将十进制数转换为 k 进制,我们使用经典的取余法:
- 用 n 除以 k,得到商和余数
- 余数就是 k 进制表示中的最低位数字
- 用商替换 n,重复上述过程,直到 n 为 0
- 将得到的所有余数相加即为答案
算法步骤:
- 初始化结果 sum = 0
- 当 n > 0 时:
- 计算 n % k,这是当前最低位的数字
- 将该数字加到 sum 中
- 更新 n = n / k(整除)
- 返回 sum
这种方法的优势在于我们不需要真正构造出 k 进制的字符串表示,而是直接在转换过程中累加各位数字,既节省空间又简化逻辑。
时间复杂度为 O(log_k n),因为需要 log_k n 次除法操作。空间复杂度为 O(1)。
代码实现
class Solution {
public:
int sumBase(int n, int k) {
int sum = 0;
while (n > 0) {
sum += n % k;
n /= k;
}
return sum;
}
};
class Solution:
def sumBase(self, n: int, k: int) -> int:
sum_digits = 0
while n > 0:
sum_digits += n % k
n //= k
return sum_digits
public class Solution {
public int SumBase(int n, int k) {
int sum = 0;
while (n > 0) {
sum += n % k;
n /= k;
}
return sum;
}
}
var sumBase = function(n, k) {
let sum = 0;
while (n > 0) {
sum += n % k;
n = Math.floor(n / k);
}
return sum;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(log_k n) | 需要进行 log_k n 次除法运算 |
| 空间复杂度 | O(1) | 只使用常数额外空间 |
相关题目
- . Count Symmetric Integers (Easy)