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));
}
}
}
评论区