[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;
}

猜你喜欢

转载自www.cnblogs.com/trav/p/10311937.html