补充知识
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;
}