一 、题目链接
二、题目截图
三、 代码答案:(c语言实现)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
char hex(int i) {
switch (i) {
case 0: return '0';
case 1: return '1';
case 2: return '2';
case 3: return '3';
case 4: return '4';
case 5: return '5';
case 6: return '6';
case 7: return '7';
case 8: return '8';
case 9: return '9';
case 10: return 'A';
case 11: return 'B';
case 12: return 'C';
case 13: return 'D';
case 14: return 'E';
case 15: return 'F';
}
return 0;
}
void conversion(int N, int R, int* a, char* s) {
int i = 0;
if (N == 0) {
a[0] = 0; i = 1;
}
while (N != 0) {
a[i] = N % R;
N /= R;
i++;
}//将转换后的数字倒序的放入数组a中
//在正序的将 a的数字对应的字母放入数组s中, s中就是进制转换后的数字。
for (int j = i - 1, k = 0; j >= 0; j--, k++) {
s[k] = hex(a[j]);
}
}
int main() {
int n;
scanf("%d", &n);
int N, R, num = 0;// 十进制数字N 转换成 R进制数字 NUM
for (int i = 0; i < n; i++) {
int a[100];
char s[100];
memset(s, '\0', 100);
scanf("%d %d", &N, &R);
if (N < 0) {
conversion(abs(N), R, a, s);
}
else {
conversion(N, R, a, s);
}
if (N >= 0) {
printf("%s\n", s);
}
else {
printf("-%s\n", s);
}
}
return 0;
}
-
在写代码的时候要注意字符串输出的一些细节,
printf("%s")
会输出数组中'\0'
之前的字符数串,所以初始换数组的memset()很有必要。 -
进制转换的那个函数需要将数字按位取出倒序放入数组,在倒序的将转换的字符放入数组,可能会有一点弯子要绕一下。
-
此代码为边输入边输出的形式,输入的数字进制转换后会立刻输出结果,
上面的这种代码更易懂,平台也是可以Accepted。
-
我写的第一版代码是可以将转换后的数字保存在数组,但是代码有点复杂,代码量也稍大,下面是之前的代码, 在平台上也能Accepted。
请选择性观看:
int main() { int n; scanf("%d", &n); int N, R;// 十进制数字N 转换成 R进制数字 NUM char** res = (char**)malloc(sizeof(char*) * n); for (int i = 0; i < n; i++) { int a[100]; char s[100]; memset(s, '\0', 100); scanf("%d %d", &N, &R); if (N < 0) { conversion(abs(N), R, a, s); } else { conversion(N, R, a, s); } int len_s = strlen(s); res[i] = (char*)malloc(sizeof(char) * (len_s+2)); memset(res[i], '\0', (len_s + 2)); if (N < 0) { res[i][0] = '-'; memcpy(res[i]+1, s, strlen(s)); } else { memcpy(res[i], s, strlen(s)); } } for (int i = 0; i < n; i++) { printf("%s\n", res[i]); } return 0; }
更新:
下面这个是我感觉更完美的写法,进制转换的时候用了递归的思路,代码非常简洁。可能是后面的数据太大了导致递归栈溢出,最后这个版本的代码没能Accepted, 大家参考一下思路。
int conversion(char *str, int num, int r){
if(num == 0) return 0;
int a = num % r;
int i = conversion(str ,num / r, r);
str[i] = a < 10 ? a +'0' : (a-10) + 'A';
return i+1;
}
int main(){
int n, N, R;
scanf("%d", &n);
int num, r;
for(int i = 0; i < n; i++){
char str[100];
memset(str, '\0', 100);
str[0] = '0';
scanf("%d %d", &num, &r);
conversion(str, abs(num), r);
if(num < 0) printf("-");
printf("%s", str);
}
return 0;
}
希望各位考研上岸,也祝自己复试顺利。