[CODEUP] 1943 進制轉換

題目描述

將一個長度最多爲30位數字的十進制非負整數轉換爲二進制數輸出。

輸入

多組數據,每行爲一個長度不超過30位的十進制非負整數。(注意是10進制數字的個數可能有30個,而非30bits的整數)

輸出

每行輸出對應的二進制數。

樣例輸入

0
1
3
8

樣例輸出

0
1
11
1000

IDEA

長整數用字符串形式存儲,主要解決的問題是字符串如何進行除法和餘數。餘數不用多說,就是最後一位餘2就行。除法則應該按照平時手算除法的順序進行,比如:

for (i = 0; i < len - 1; i++) {
    s[i+1] += (s[i] % 2) * 10;
    s[i] /= 2;
}

剩下的就是依照平時的整數進制轉換的順序來即可。

SOLUTION

#include <stdio.h>
#include <string.h>

int main()
{
    int i, len, num, sum;
    char s[100];
    char ans[100];

    while (scanf("%s", s) != EOF) {
        len = strlen(s);
        for (i = 0; i < len; i++)
            s[i] -= '0';
        
        num = 0;
        memset(ans, 0, sizeof ans);

        do {
            /* sum of each digit */
            sum = 0;

            /* % 2 */
            ans[num++] = s[len - 1] % 2 + '0';

            /* / 2 */
            for (i = 0; i < len - 1; i++) {
                s[i+1] += (s[i] - ((s[i] >> 1) << 1)) * 10;
                s[i] >>= 1;
                sum += s[i];
            }
            s[i] >>= 1;
            sum += s[i];
        } while (sum != 0);

        while (num--)
            putchar(ans[num]);
        putchar('\n');
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章