前言
牛客網(wǎng)PAT乙級(jí)訓(xùn)練1018
題目描述
把一個(gè)整數(shù)的各位累加疾就,NowCoder稱它為“數(shù)位和”猬腰。例如正整數(shù)123456的數(shù)位和是1+2+3+4+5+6=21。現(xiàn)在姑荷,請(qǐng)你幫忙計(jì)算一個(gè)整數(shù)n在r進(jìn)制下的數(shù)位和缩擂,并用相應(yīng)的進(jìn)制輸出結(jié)果胯盯。
輸入描述
輸入有多組數(shù)據(jù)计露。
每組數(shù)據(jù)包含兩個(gè)正整數(shù)n (1≤n≤2147483647)和r (2≤n≤16)。
輸出描述
對(duì)應(yīng)每一組數(shù)據(jù)叉趣,輸出十進(jìn)制正整數(shù)n轉(zhuǎn)換成r進(jìn)制后的數(shù)位和胶坠,并用r進(jìn)制輸出結(jié)果。
輸入例子
123456 10
123456 2
輸出例子
21
110
解析
題目其實(shí)不難乡数,思路也很清晰闻牡,先轉(zhuǎn)換成對(duì)應(yīng)進(jìn)制的數(shù)然后在十進(jìn)制下求和罩润,然后再轉(zhuǎn)換成相應(yīng)進(jìn)制即可。
- 難點(diǎn)在于割以,當(dāng)進(jìn)制數(shù)超過10時(shí)金度,會(huì)出現(xiàn)字母,如何進(jìn)行字母的運(yùn)算严沥。
以下方法可以解決:
10 + (ch - 'a');
遇到小寫十六進(jìn)制數(shù)轉(zhuǎn)換成數(shù)字時(shí)用
比如0x0b應(yīng)當(dāng)對(duì)應(yīng)十進(jìn)制11
如果我拿到字符:'b'猜极,將之轉(zhuǎn)換成11的方法就是
'b'-'a'得到1,加10得到11消玄,同理'f'-'a'+10=15
解決方案
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int num = scanner.nextInt();
int n = scanner.nextInt();
String n_num = Integer.toString(num, n);
int sum = 0;
for (char ch : n_num.toCharArray()) {
if (Character.isDigit(ch)) sum += ch - '0';
else sum += 10 + (ch - 'a'); //得到對(duì)應(yīng)10進(jìn)制下的數(shù)
}
System.out.println(Integer.toString(sum, n).toUpperCase());
}
}
}