题目:输入整数n和M,输出n在M进制下的表示字符串。如n=3000,M=16,输出16进制下3000的表示字符串,为“BB8”
来源:某500强企业面试题目
思路:对n取模M,将得到的数字压入栈中,再令 n = n / M 的商。重复这一过程,可以得到每一位的数字。
将栈内的数字出栈,并转为字符表达,凑成完整的字符串即可
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
//----------------------------------------
// 将n用M进制表示并输出
//----------------------------------------
#define MAX_NUM 1024
char *M_Ary(int n, int M) {
int Ary[MAX_NUM] = {0};
char *str = 0;
int i = 0;
int a = 0;
int b = 0;
int c = 0;
int num = 0;
i = 0;
a = n;
while (a >= M) { // 反复取余,放入Ary数组中
b = a % M; // 取余数
a = a / M; // 取商
Ary[i] = b;
i++;
if (i > MAX_NUM-1) return 0;// 如果越界,返回NULL
}
Ary[i] = a;
num = i + 1; // 获得数组长度
str = (char*)malloc(num + 1); // 创建字符串
if (!str) return 0; // 如果创建失败,返回NULL
memset(str, 0, num + 1); // 清空字符串
for (i = 0; i < num; i++) { // 倒序将Ary数组的数字放入str中
c = Ary[num - i - 1];
if (c < 10) {
str[i] = '0' + c; // 如果是 0-9,则输出数字
} else {
str[i] = 'A' + (c - 10); // 如果是 > 10,则输出A-Z
}
}
return str;
}
//-------------------------------------------------------------------------
void TestM_Ary(void) {
int n, M;
char *str = 0;
n = 10;
M = 2;
str = M_Ary(n, M);
printf("M_Ary(%d, %d) = %s\n", n, M, str);
free(str);
n = 100;
M = 8;
str = M_Ary(n, M);
printf("M_Ary(%d, %d) = %s\n", n, M, str);
free(str);
n = 3000;
M = 16;
str = M_Ary(n, M);
printf("M_Ary(%d, %d) = %s\n", n, M, str);
free(str);
}
//-------------------------------------------------------------------------
int main(int argc, char *argv[]) {
TestM_Ary();
getchar();
return 0;
}