數(shù)位和

前言

??途W(wǎng)PAT乙級訓(xùn)練1018

題目描述

把一個整數(shù)的各位累加,NowCoder稱它為“數(shù)位和”。例如正整數(shù)123456的數(shù)位和是1+2+3+4+5+6=21?,F(xiàn)在,請你幫忙計算一個整數(shù)n在r進制下的數(shù)位和,并用相應(yīng)的進制輸出結(jié)果。

輸入描述

輸入有多組數(shù)據(jù)。
每組數(shù)據(jù)包含兩個正整數(shù)n (1≤n≤2147483647)和r (2≤n≤16)。

輸出描述

對應(yīng)每一組數(shù)據(jù),輸出十進制正整數(shù)n轉(zhuǎn)換成r進制后的數(shù)位和,并用r進制輸出結(jié)果。

輸入例子

123456 10
123456 2

輸出例子

21
110

解析

題目其實不難,思路也很清晰,先轉(zhuǎn)換成對應(yīng)進制的數(shù)然后在十進制下求和,然后再轉(zhuǎn)換成相應(yīng)進制即可。

  • 難點在于,當(dāng)進制數(shù)超過10時,會出現(xiàn)字母,如何進行字母的運算。
    以下方法可以解決:
10 + (ch - 'a');

遇到小寫十六進制數(shù)轉(zhuǎn)換成數(shù)字時用
比如0x0b應(yīng)當(dāng)對應(yīng)十進制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');    //得到對應(yīng)10進制下的數(shù)
            }
            System.out.println(Integer.toString(sum, n).toUpperCase());
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我剛看完了《安妮日記》,背景是二戰(zhàn)時猶太人被追殺,里面說的是 有兩家人在基督徒的幫助下在密室里度日發(fā)生的一系列事情...
    黃晴晴閱讀 250評論 1 0
  • 陸獻回來時,已經(jīng)是凌晨一點過。 彼時的沈芫已經(jīng)睡得有些迷糊了,自從上次陸獻看見自己的醉酒,竟然破天荒的命人置備了冰...
    闕里閱讀 442評論 0 0

友情鏈接更多精彩內(nèi)容