2008年北大信科研究生复试 机考真题(一)--大数据十进制转换

描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出
每行输出对应的二进制数。
样例输入
0
1
3
8
样例输出
0
1
11	

1000

本题思路:

十进制转换为二进制问题,这种计算在纸上很容易计算是吧,那么如何在计算机中实现呢?首先我们明确一个十进

数反复除上2,位数肯定一直在减少。在本程序里面用num数组存放除以2后的结果。比如说求19的二进制,那么

num[0]=1,num[1]=9是初值。经过一轮迭代后,binary[0]='1',因为19是奇数嘛!num[0]=0,num[1]=9,在

求num[1]时,c=10,因为temp暂存的最高位是奇数1嘛!肯定要借位嘛!如果不借位,结果是4,正确结果是9!!

借位的意思就是次高位得加上10,么么哒~for (int j = i; j < len; j++)这个循环就是从最高位依次除以2

将新结果存放到num矩阵中!如果num[i]=0说明i位被除没了(i位一直是待处理数字的最高位),比如说19/2=9,

num[0]=0,i就变成1,最高位是个位~,最后再讲bianry数组倒着输出一遍,ok结束了,么么哒~亲!!!

#include<stdio.h>
char s[35];//十进制数最多30位
char binary[200];//二进制最多120位
int num[35];
int main()
{
	int len;//数字的位数
	int temp;//记录当前十进制数字的最高位
	while (scanf("%s", s) != EOF)
	{
		for (len = 0; s[len]; len++)
		{
			num[len] = s[len] - '0';
		}
		int i = 0; int binary_length = 0;
		while (i < len)//num[i]永远是非0的待处理数最高位
		{
			binary[binary_length++] = num[len - 1] % 2 + '0';//十进制数字最后一位如果是奇数则为1,反之为0
			int c = 0;
			for (int j = i; j < len; j++)
			{
				temp = num[j];
				num[j] = (num[j] + c) / 2;//j == i时,num[i]存放的是最高位除上2的结果
				if (temp & 1)//temp是奇数
				{
					c = 10;//高位是奇数,高位的下一位除以2绝对得借位!
				}
				else { c = 0; }//高位是偶数,不需要借位
			}
			if (num[i] == 0)//高位已经为0,
			{
				i++;
			}
		}
		for (int j = binary_length - 1; j >= 0; j--)
		{
			printf("%c", binary[j]);
		}
		printf("\n");
	}
	return 0;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值