-
题目描述
输入一个十进制数N,将它转换成R进制数输出。
-
Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
-
Output
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
-
Sample Input
7 2 23 12 -4 3
-
Sample Output
111 1B -11
-
分析
本题就是一个进制转换的题目,如果是要转换为3进制,那么就和3取余,在除以3,再用商取余,记录余数再除以3依次类推,直到商为0,然后记录每一次取余的结果,在倒序输出比如15
取余 15 % 3 5 % 3 1 % 3 余数 0 2 1 商 5 1 0 在倒序输出就是120
然后本题的难点,在于如何输出大于10进制的数,可以利用字符数组,将每一个余数+'0’转换为字符,然后比较如果等于58就将其转化为字符A,59为B依次类推进行赋值,因为9的ASCII码值为57。最后在倒序输出即可。
-
AC代码
#include <stdio.h> #include <string.h> int main() { int N, R; while (scanf("%d%d", &N, &R) != EOF) { char b[10001] = {0}; char ans[10001] = {0}; int flag = 0;//标记是否小于0 int cnt = 0;//标记数组大小 if (N < 0)//如果小于0将其变为整数,并将flag赋值为1 { N = -N; flag = 1; } while(N) { b[cnt] = N % R + '0';//加上字符零使之变成字符 N /= R; if (b[cnt] == 58)//进行比较来输入字母A b[cnt] = 'A'; else if (b[cnt] == 59) b[cnt] = 'B'; else if (b[cnt] == 60) b[cnt] = 'C'; else if (b[cnt] == 61) b[cnt] = 'D'; else if (b[cnt] == 62) b[cnt] = 'E'; else if (b[cnt] == 63) b[cnt] = 'F'; cnt++; } for (int i = 0; i < cnt; i++)//进行倒序 ans[i] = b[cnt - 1 - i]; if (flag)//输出,如果小于0输出-%s,否则为%s printf("-%s\n", ans); else printf("%s\n", ans); } return 0; }