题目地址
题目描述
给你一个整数
n(10进制)和一个基数k,请你将n从10进制表示转换为 k 进制表示,计算并返回转换后各位数字的 总和 。转换后,各位数字应当视作是
10进制数字,且它们的总和也应当按 · 进制表示返回。
- 示例 1:
输入:n = 34, k = 6 输出:9 解释:34 (10 进制) 在 6 进制下表示为 54 。5 + 4 = 9 。
- 示例 2:
输入:n = 10, k = 10 输出:1 解释:n 本身就是 10 进制。 1 + 0 = 1 。
提示:
1 <= n <= 100 2 <= k <= 10
思路
- 先将非负的十进制整数转换成k进制数,且返回类型为
String;
由于
十六进制会带ABCDEF等后缀,故返回的是String类型
进制转换常用的是
除二取余法,将
String类型的k进制数转成字符数组,再进行累加计算(需要-48)即可;
注意的是,这里
字符数组中的数字是以ASCII的形式进行存储,例如0的ASCII值是48,1的ASCII值是49……因此在每次计算时都需要-48。当然有其他方法均可。
关键点
- 十进制转换成k进制:
除二取余法 - 这里使用
递归的方式来实现,递归公式如下:

递归栈,如下图:

代码

class Solution {
/**
* 计算每个数字,各个数位的求和
* @param n 非负十进制整数
* @param k 进制
* @return sum 各个数位的求和
*/
public static int sumBase(int n, int k) {
int sum = 0;
// int ik = Integer.valueOf(binary(n, k));
// System.out.println(binary(n, k));
char[] chs = binary(n, k).toCharArray();
for (int i = 0; i < chs.length; i++) {
// System.out.println(Integer.valueOf(chs[i])-48);
sum += Integer.valueOf(chs[i]-48); //0的ASCII值是48
}
return sum;
}
/**
* 除二取余法
* 非负十进制整数n转换成k进制,其中2<=k<=16
* 递归:
* fun(n) = n, n<=k
* = n%k + fun(n/k), k<n<=16
* @param n 非负十进制整数
* @param k 进制
* @return String 由于像16进制会带ABCDEF等后缀
*/
public static String binary(int n,int k) {
if(n<k) {
if(n<10) return String.valueOf(n);
else if(10==n) return "A";
else if(11==n) return "B";
else if(12==n) return "C";
else if(13==n) return "D";
else if(14==n) return "E";
else return "F";
} else {
if((n%k)<10)
return binary(n/k,k).concat(String.valueOf(n%k));
if((n%k)==10)
return binary(n/k,k).concat("A");
else if((n%k)==11)
return binary(n/k,k).concat("B");
else if((n%k)==12)
return binary(n/k,k).concat("C");
else if((n%k)==13)
return binary(n/k,k).concat("D");
else if((n%k)==14)
return binary(n/k,k).concat("E");
else
return binary(n/k,k).concat("F");
}
}
public static void main(String[] args) {
System.out.println(sumBase(34, 6));
}
} 
京公网安备 11010502036488号