一 、题目链接
二、题目截图
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aw9WOWjk-1679278189766)(C:\Users\27832\AppData\Roaming\Typora\typora-user-images\image-20230320095303757.png)]](https://i-blog.csdnimg.cn/blog_migrate/269641967bb255a4302c76392c7289cc.png)
三、 代码答案:(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;
}
希望各位考研上岸,也祝自己复试顺利。
文章提供了一个C语言程序,用于实现将十进制数字转换为指定进制的字符串表示。代码包括一个主函数和一个辅助函数,处理正负数并使用数组存储转换结果。还讨论了使用递归进行进制转换的尝试,但由于可能的栈溢出问题未被采纳。
1329

被折叠的 条评论
为什么被折叠?



