HDU2051進制轉換

#include <stdio.h>
int main()
{
    int a,n,i,cnt=0;
    int num[30];
    while(~scanf("%d",&a))
    {
        int i=0;
        do{
            num[i]=a%2;
            a=a/2;
            i++;
        }while(a!=0);
        while(i>0)
            printf("%d",num[--i]);
        printf("\n");
    }
    return 0;
}

題目變形:實現兩種不同進制之間的數據轉換。
輸入
輸入數據共有三行,第一行是一個正整數,表示需要轉換的數的進制n(2≤n≤16),第二行是一個n進制數,若n>10則用大寫字母A~F表示數碼10~15,並且該n進制數對應的十進制的值不超過1000000000,第三行也是一個正整數,表示轉換之後的數的進制m(2≤m≤16)。
輸出
輸出僅一行,包含一個正整數,表示轉換之後的m進制數。
樣例輸入
16
FF
2
樣例輸出
11111111

分析:以10進製爲中間量,將n進制轉化爲10進制,再將10進制轉換爲m進制。

/*!
m進制(數字)字符串轉爲n進制字符串。(先由m進制轉爲10進制,再由10進制轉爲n進制)
\param dest 轉換完畢的n進制字符串
\param n 目的進制數(十六進制填16、二進制填2等)
\param src 初始m進制字符串
\param m 初始進制數,與目的進制數表示方法相同
\warning 初始m進制字符以10進製表示若超過int表示範圍,結果未定義;且轉換爲n進制需要的字符個數未知。
*/
void m2n(char *dest, unsigned int n, const char *src, unsigned int m)
{
    char ch, *p = dest - 1;
    unsigned int i = 0;

    /* m進制字符串src轉爲10進制數i */
    while (*src) i = i * m + *src++ - '0';

    /* 輾轉相除得出逆序的n進製表示在dest */
    while (i) *dest++ = i % n + '0', i /= n;

    /* 在dest寫入結尾符 */
    *dest = '\0';

    /* 逆序字符串 */
    while (++p < --dest)
    {
        ch = *dest;
        *dest = *p;
        *p = ch;
    }
}

int main()
{
    char result[100];

    m2n(result, 10, "56", 16);
    printf(result);

    return 0;
}
發佈了47 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章