[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;
}
posted @ 2019-01-23 22:53  trav  阅读(434)  评论(0编辑  收藏  举报