将十进制整数n(−2^31≤n≤2^31-1)转换成k(2≤k≤16)进制数。注意,10~15分别用字母A、B、C、D、E、F表示。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入两个整数n和k。
输出格式:
对于每组测试,先输出n,然后输出一个空格,最后输出对应的k进制数。
输入样例:
4
5 3
123 16
0 5
-12 2
输出样例:
5 12
123 7B
0 0
-12 -1100
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路
- convert函数:
该函数用于将10进制整数n转化为k进制数输出。首先,对于负数n,将其变为正数,并在输出结果前打印符号“-”。
其次,利用“除k取余”的方法,将n转化为k进制数的每一位,并将其存在digits数组中。
最后,倒序输出digits数组中存放的结果,如果该位数字大于等于10,则需要将其转化为相应的字母。
2.main函数:
首先,从标准输入读入测试数据组数T。
接下来,循环T次。每次循环从标准输入读入n和k,并调用convert函数将n转化为k进制数输出。
最后,主函数返回0。
代码
#include <stdio.h>
// 定义一个函数 convert,参数为整数n和k,返回类型为void
void convert(int n, int k) {
// 定义一个数组 digits 用于存放转换后的数字的每个数位,数组长度为40
// 定义一个计数器 cnt 记录当前数字的位数
int digits[40], cnt = 0;
// 判断被转换数是否为负数,如果是,将n变为正数,并输出符号“-”
if (n < 0) {
n = -n;
printf("-");
}
// 使用“除k取余”的方法将数字n转换为k进制数的每个数位
// 并将每个数位存放到数组 digits 中
do {
digits[cnt++] = n % k;
n /= k;
} while (n > 0);
// 倒序输出数组 digits 中每个数位表示的数字
// 如果该数位表示的数字大于等于10,则输出对应字母
for (int i = cnt - 1; i >= 0; i--) {
if (digits[i] < 10) printf("%d", digits[i]);
else printf("%c", digits[i] - 10 + 'A');
}
// 输出换行符,表示当前数字转换完成
printf("\n");
}
// 定义主函数
int main() {
// 定义一个变量 T,表示需要测试的数据组数
int T;
// 从标准输入中读入数据组数T
scanf("%d", &T);
// 循环执行T次
while (T--) {
// 定义变量 n 和 k,表示需要转换的数字和目标进制
int n, k;
// 从标准输入中读入需要转换的数字 n 和目标进制 k
scanf("%d%d", &n, &k);
printf("%d ",n);
// 调用函数 convert,将 n 转换为 k 进制数并输出
convert(n, k);
}
// 返回值 0,程序运行正常结束
return 0;
}