ECNU 1147 进制转换
ECNU 1147 进制转换
链接
https://acm.ecnu.edu.cn/problem/1147/
题目
单点时限: 2.0 sec
内存限制: 256 MB
输入一个十进制数n,将它转换成r进制数输出。
输入格式
输入一个正整数t。表示测试数据的组数。
每个测试实例包含两个整数n(32位整数) 和r (2 <= r <= 36).
输出格式
为每个测试实例输出转换后的数,每个输出占一行。如果r大于10,则对应的数字规则参考16进制(比如10用 A 表示 ,16用 G 表示等等)。
样例
input
3
7 2
23 12
-4 3
output
111
1B
-11
思路
传统艺能,数据不作妖就是考察细心的进制转换,这里要注意的是,可能存在负数,用flag存储符号位,其实不存也行,但是这样思路清晰一点。用除法来取数,从后往前,所以输出时要倒着输出,根据flag进行负号处理。
这题还有变形,m进制转n进制,这里最清晰的思路就是以十进制为中转,进行处理。狠一点可以用java自带的函数进行处理。
还要考虑到换行,就是格式问题。
代码
public static void cal(int n, int r) {
int flag = 0;
//0+1-
if (n < 0) {
flag = 1;
n = (-1) * n;
}
if (flag == 1) {
System.out.print("-");
}
if (r == 10) {
System.out.println(n);
} else {
int[] a = new int[36];
int j = 0;
while (n != 0) {
a[j] = n % r;
j++;
n = n / r;
}
for (int num = j - 1; num >= 0; num--) {
if (a[num] > 9) {
char t = (char) (a[num] + 55);
System.out.print(t);
} else {
System.out.print(a[num]);
}
}
System.out.println();
}
}
public static void fun() {
Scanner sc = new Scanner(System.in);
int t;
t = sc.nextInt();
for (int i = 0; i < t; i++) {
int n;
n = sc.nextInt();
int r;
r = sc.nextInt();
cal(n, r);
}
}