题目描述
输入整数范围 [0,4294967295]
算法1:
$ \color{red}{位运算} $
#include<iostream>
#include <vector>
using namespace std;
typedef long long LL;
int main()
{
LL n;
while(cin >> n)
{
if(n == 0) // 0 的时候单独处理
{
puts("0");
break;
}
vector <int> v; //用来存放二进制数
while(n)
{
v.push_back(n & 1);
n >>= 1;
}
for(auto i = v.end()-1;i != v.begin() - 1;i --) cout << *i; //注意倒序输出
puts(" ");
}
return 0;
}
算法2
$ \color{red}{bitset函数} $
STL中的bitset可以直接将十进制数转成二进制数,由bitset的语法可知,二进制数的位数是预先自己设定的,超出的部分系统自动补零,因此输出的时候删去前导零,即从最先不是0的位数开始输出即可。
#include<iostream>
#include<bitset>
using namespace std;
typedef long long LL;
const int N=35; //2^31=2147483648,2^32=4294967296
int flag;
int main()
{
LL n;//整型范围为-2^31~2^31-1,此题范围为[0,4294967295],故开long long
while(cin >> n)
{
if(n == 0)
{
puts("0");
break;
}
bitset<N>a(n);//十进制转化为二进制,此时含有35位
for(int i = 35;i >= 0;i --)
if(a[i])
{
flag = i; //因为不能输出前导0,所以标记二进制数的第一个1的位置
break;
}
for(int i = flag;i >= 0;i --) cout << a[i];//从标记的位置开始遍历输出
puts("");
}
return 0;
}