目 录CONTENT

文章目录

3438. 数制转换

Gz
Gz
2022-07-02 / 0 评论 / 0 点赞 / 251 阅读 / 1,376 字 / 正在检测是否收录...

3438. 数制转换

求任意两个不同进制非负整数的转换(22 进制 ∼∼ 1616 进制),所给整数在 int 范围内。

不同进制的表示符号为(0,1,…,9,a,b,…,f0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F0,1,…,9,A,B,…,F)

输入格式

输入只有一行,包含三个整数 a,n,ba,n,b。aa 表示其后的 nn 是 aa 进制整数,bb 表示欲将 aa 进制整数 nn 转换成 bb 进制整数。

a,ba,b 是十进制整数。

数据可能存在包含前导零的情况。

输出格式

输出包含一行,该行有一个整数为转换后的 bb 进制数。

输出时字母符号全部用大写表示,即(0,1,…,9,A,B,…,F0,1,…,9,A,B,…,F)。

数据范围

2≤a,b≤162≤a,b≤16,
给定的 aa 进制整数 nn 在十进制下的取值范围是 [1,2147483647][1,2147483647]。

输入样例:

15 Aab3 7

输出样例:

210306

题解

import java.util.*;

public class Main {
    public static int b;
    public static void main(String[] args)throws Exception {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        String n = scanner.next();
        b = scanner.nextInt();
        int sum = 0;

        //预处理
        int square[] = new int[n.length()];
        square[0] = 1;
        for (int i = 1; i < n.length(); i++) {
            square[i] = square[i - 1] * a;
        }
        //按权展开再相加
        for (int i = 0 ; i < n.length() ; i ++) {
            int tmp = n.charAt(i);
            int r = 0;
            //变成十进制
            if (tmp >= 'a' && tmp <= 'z') r = tmp - 'a' + 10;
            else if (tmp >= '0' && tmp <= '9') r = tmp - '0';
            else if (tmp >= 'A' && tmp <= 'Z') r = tmp - 'A' + 10;

            sum += r * square[n.length() - 1 - i];
        }

        //十进制转R进制数 除R取余法
        Stack<Integer> stack = new Stack<>();

        while (sum != 0){
            int i = sum % b;
            sum = sum / b;
            stack.push(i);
        }
        //获取栈的长度,直接在循环中获取,栈的长度会随着pop弹出而变化
        int len = stack.size();
        for (int i = 0; i < len; i++) {
            int stk = stack.pop();
            if (stk >= 0 && stk <= 9) System.out.print(stk);
            else System.out.printf("%s",(char)('A'-10+stk));
        }

    }
}
0

评论区