练习题(三)
时间限制: 1 Sec 内存限制: 128 MB
[命题人:171360140]
题目描述
李华上大学报的是物联网专业,在老师介绍完专业后,让同学们学习进制转换,刚开始李华并不会进制转换,他就从最简单的2进制开始学习。下面给你一个10进制的整数,让你求出他的2进制数是多少?
十进制---->二进制
0 ----> 0
1 ----> 1
2 ----> 10
3 ----> 11
输入
第一行输入一个整数n(0<n<100)
下面有n行,每行有一个十进制整数x (-65536<x<65536)
输出
输出有n行
每行对应的是转换后的二进制数
样例输入
4
0
1
2
3
样例输出
0
1
10
11
来源/分类
寒假练习赛
题目网址: http://47.112.31.182/problem.php?id=1067
题意:
本题就是让求十进制变为二进制,要注意的就是负数问题
思路:
对于正整数直接对2取余取商就行了。
当为负数时(比如十进制的-1):
- 先把负数去掉,然后对对2取余取商((十进制1=二进制0000000000000001)
- 取反:0变1,1变0(变成1111111111111110)
- 加一:最后一位加1,大于等于2向前进一(1111111111111111)
- 十进制的(-1)=二进制(1111111111111111)
16位的也可以用(65536+x)%65536然后再对这个数进行二进制的转换(65535=2的16次方)
本题用bitset更为简便,不过要注意的是为0的情况
bitset里面的方法
代码:
#include <iostream>
#include <string> //string容器的头文件
using namespace std;
int main()
{
string s; //创建
int n,x;
cin>>n; //n组数据
for(int i=0;i<n;i++)
{
s=""; //令s为空
cin>>x; //十进制数x
if(x==0) //x为0时
{
s='0';
cout<<s<<endl;
}
else
{
x=(x+65536)%65536; //x+65536再对65536取余
while(x)
{
if(x%2==1) //对2取余为1
s='1'+s; //把1加到s前面
else //余数为0
s='0'+s; //把0加到s前面
x=x/2; //对2取商
}
cout<<s<<endl; //输出二进制数(string型s)
}
}
return 0;
}
bitset代码
#include <bitset>
#include <algorithm>
using namespace std;
int main()
{
int x,n;
bitset<16> a;
cin>>n;
while(n--)
{
cin>>x;
a=x;//把十进制的x以二进制存进a中
if(a.any()==0) //判断是否存在1
cout<<"0"<<endl;
for(int j=15;j>=0;j--) //倒序输出
{
if(a[j]!=0) //去前导0
{
for(int i=j;i>=0;i--)
{
cout<<a[i];
}
cout<<endl;
break;
}
}
}
return 0;
}
运行结果:
总结:
进制的转换找到了规律就好算多了,不过基础的运算还是要记住的。
用bitset求二进制更为简便,不过要注意为0的情况