中学学过的方法是这样的:
假设我要把十进制2991转换成十二进制,那么就用12来除2991,余数是十二进制数的最低位,继续用12除之前所得到的的商,余数是十二进制数的第二位,以此类推。直到最后所得商数为0,算法终止。需要注意的是十六进制中,10~15是用英文字母ABCDEF来表示的,这个需要特别处理。
C++代码:
#include <stdio.h>
#include <math.h>
#include <string>
void mySwap(char& a, char& b) {
char temp = a;
a = b;
b = temp;
}
// 翻转字符串
void reverseStr(char src[]) {
int i = 0, j = strlen(src) - 1;
while (i < j) {
mySwap(src[i++], src[j--]);
}
}
char* convertBase(int num, const int base, char str[]) {
int result = 0, i = 0;
while (num > 0) {
int temp = (num % base);
if (base != 16)
result += temp * (int) pow(10.0, i);
else {
if (temp >= 10)
str[i] = 'A' + temp - 10;
else
sprintf(str + i, "%d", temp);
}
num /= base;
i++;
}
if (base != 16) {
// 将整数转换成字符串
sprintf(str, "%d", result);
return str;
} else {
reverseStr(str);
return str;
}
}
int main()
{
// 初始化字符串buffer
char str[10] = {'\0'};
convertBase(2991, 16, str);
printf("%s\n", str);
return 0;
}