无符号十进制整数转换成任意进制数

来源:互联网 发布:一知f君百度网盘 编辑:程序博客网 时间:2024/05/11 15:35

题目:将一个无符号整数转换为任意 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";inti = 0;while (1){srt[i++] = a[n%d];n = n / d;if (n == 0)break;}srt[i] = '\0';}/* 将转换的数组倒置 */void reversion(char srt[], char dst[]){inti = 0;intj, k;j = k = strlen(srt);while (1){dst[i] = srt[--j];if (i == k - 1)break;i++;}dst[k] = '\0';}int main(void){intn;intd;charsrt[MAX];chardst[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语言里,这是一个必须得留心的问题,而且如果程序很大的话,会很难发现的,所以在这里提个醒。

0 0
原创粉丝点击