题目45:进制转换

补充知识
c/c++中int,long,long long的取值范围:

unsigned int 0~4294967295
int -2147483648~2147483647
unsigned long 0~4294967295
long -2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551615 //20位

__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615

题目描述

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

解题思路

//有难度 
#include<iostream>
using namespace std;
int main()
{
	char s[40],res[200];//分别存放十进制与二进制
	int num[40];//存放十进制 用于计算
	while(cin>>s) 
	{
		int len;
		for(len=0;s[len]!='\0';len++)
		{
			num[len]=s[len]-'0';
		}
		//跳出循环后 len记录的s的长度
		int i=0;
		int len_res=0;
		while(i<len)
		{
			res[len_res]=num[len-1]%2+'0';
			//这里是转化为 2 进制,只用最后一位来除 2 余数就可以了,
			//其他高位对除 2 余数不影响,因为从高位借过一位来总是能被 2 整除, 
			len_res++;
			int c=0;//借位 
			for(int j=i;j<len;j++)//从高位开始除 
			{
				int tmp=num[j];
				num[j]=(num[j]+c)/2;//当这一位是奇数的时候表示不能整除 2,要借位了
				if(tmp%2==1)
				{
					c=10;
				}else{
					c=0;
				}
			}
			if(num[i]==0)//可能前几次不为 0,再循环
			{
				i++;
			}
		}
		for(int i=len_res-1;i>=0;i--)
		{
			cout<<res[i];
		} 
		cout<<endl;
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值