您的位置:首页 > 其它

C实现任意进制数的转化

2015-05-19 00:00 169 查看
该实例要求使用C实现一个无符号整数到[2,16]进制数的转换。这个还是比较好想的,就是对该无符号整数不断的斤进制数d取余数,取商,一直做这样的运算,直到商为0为止,将所有的余数按照从后往前的顺序穿起来,就是转换后的进制数。

下面上我的代码:

#include <stdio.h>

/** 用于声明char数组的长度 **/
#define M (sizeof(unsigned int) * 8)

int trans(unsigned int m,int d,char s[]);

/** * @brief main 将一个无符号整数转换成任意d进制数(2 << d << 16) * @return */
int main(void)
{
/** * 思路:将一个无符号整数m转换成任意d进制数, * 则可以将m除以d,将余数从char数组的最后一位 * 向前保存,同时将商再除以d,以同样的方式进行处理 * 最后得到的数组就是所对应的d进制数 */

unsigned int m;

printf("Please enter the digits you want to transform:\n");
scanf("%d",&m);

char str[33];

int i = 0;

printf("The translate results are:\n");

for(i = 2;i <= 16;i++){
int nums = trans(m,i,str);

printf("%d = ",m);
int j = 0;
for(j = 0;j < nums;j++){
printf("%c",str[j]);
}

printf("(%d)\n",i);
}

return 0;
}

/** * @brief trans 用于对无符号整数转换 * @param m 要被转换的数字 * @param d 要被转换成的进制数 * @param s 存放被转换后的进制数的数组 * @return 返回转换后进制数的长度,也就是数组的长度 */
int trans(unsigned int m,int d,char str[]){

if(d < 2 || d > 16){
//将s置为0
str[0] = '\0';
return 0;
}

/** 用于保存进制数 **/
char digits[] = "0123456789ABCDEF";

int i = M;
int j = 0;
char buf[M+1];
/** 用于保存商 **/
int s = m;

buf[i] = '\0';

//这里使用do...while
do{
buf[--i] = digits[s % d];
s = s / d;
}while(s);

//对数组s进行赋值
for(j = 0;(str[j]=buf[i])!= '\0';j++,i++);

return j;
}

下面是我的运行结果截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  进制转换 C 实例