无符号十进制整数转换成任意进制数
题目:将一个无符号整数转换为任意 d 进制数( 2 ≤ d ≤ 16 )。
思路:先举个例子。十进制100怎么转换为二进制呢?
记住:d进制的数就是0~(d-1)。
一般都是用辗转相除法(应该是叫这个名字),我比较喜欢这样写,比较直观:
`
这样我们就很清楚地知道是一直在除以2,直至被除数为0。
我们就将余数储存在一个数组里,到时候再将数组逆序输出,则100的二进制数1100100就能得到!
其它进制也一样,不过是除数改变而已。
所以步骤就是:
1.将余数储存在数组里
2.将数组倒置
3.输出数组
下面给出代码:
/* 实现十进制转换任意进制 */
#include <stdio.h>
#include <string.h>
#define MAX sizeof(unsigned)*8 - 1
/* 将十进制n转换成d进制 */
void trans(unsigned n, int d, char srt[])
{
char *a = "0123456789ABCDEF";
int i = 0;
while (1)
{
srt[i++] = a[n%d];
n = n / d;
if (n == 0)
break;
}
srt[i] = '\0';
}
/* 将转换的数组倒置 */
void reversion(char srt[], char dst[])
{
int i = 0;
int j, k;
j = k = strlen(srt);
while (1)
{
dst[i] = srt[--j];
if (i == k - 1)
break;
i++;
}
dst[k] = '\0';
}
int main(void)
{
int n;
int d;
char srt[MAX];
char dst[MAX];
printf("Please input a nuber:");
scanf("%d", &n);
for(d = 2; d <= 16; d++)
{
trans(n, d, srt);
reversion(srt, dst);
printf("%5d = %s<%d>\n", n, dst, d);
}
return 0;
}结果运行如下:
虽然这个程序还有很多地方可以优化,但总体思路应该明确了。
值得注意的是:一开始我写出来的时候运行结果却不正确,然后我仔细地看了一下代码才发现原来字符串数组后没有加上'\0'!在C语言里,这是一个必须得留心的问题,而且如果程序很大的话,会很难发现的,所以在这里提个醒。
浙公网安备 33010602011771号