C实现任意进制数的转化
该实例要求使用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;
}下面是我的运行结果截图: 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号