天天看點

C實作任意進制數的轉化

版權聲明:您好,轉載請留下本人部落格的位址,謝謝 https://blog.csdn.net/hongbochen1223/article/details/45246025

該執行個體要求使用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;
}           

下面是我的運作結果截圖: