来源:点击打开链接
可以模拟过,不过练习这个题的目的是学习stl中的bitset,一个神奇的二进制容器.
和vector/MAP等容器一样,bitset具备stl库函数的几乎所有特性,同时加入了一些自己的东西,对二进制处理十分便利,尤其是在找零和找一的方面.
ps:遍历的话,bitset默认是从后往前遍历的.所以不要自己再倒过来了.
一些库函数及用法的实例:
典型的bitset初始化示例
- bitset<16> bi(0xffff);:初始化为unsigned值
- bitset<32> bi(str);:用string对象初始化,翻转赋值
- bitset<4> bi(str, 5, 4);:截取string对象从下标5开始的4个字符,翻转赋值
- bitset<4> bi(str, str.size() - 4);:截取string对象的最后4个字符,翻转赋值
bitset对象常用操作
- bi[3]:访问指定下标的二进制位
- bi.size():返回bitset的位数
- bi.count():返回bitset中值为1的位数
- bi.any():是否存在值为1的位
- bi.none():是否不存在值为1的位,与any()相反
- bi.test(3):指定下标的值是否为1
- bi.set():将所有二进制位置1
- bi.set(3):将指定下标的值置1
- bi.reset():将所有二进制位置0
- bi.reset(3):将指定下标的值置0
- bi.flip():将所有二进制位翻转
- bi.flip(3):将指定下标的值翻转
- bi.to_ulong():使用bi中同样的二进制位,返回一个unsigned long.
#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
#include <cstdlib>
#include <bitset>
using namespace std;
int main()
{
int testcase;
int counter=1;
while(cin>>testcase)
{
if(testcase==0)
break;
cout<<"Answer to case"<<counter++<<":"<<endl;
for(int i=1; i<=testcase; i++)
{
int tar;
int lastdigit;
int conv;
cin>>tar;
bitset<32> pack(tar);
//cout<<pack<<endl;
for(int i=0; i<pack.size(); i++)
{
if(pack[i]==1)
{
pack[i]=0;
break;
}
}
//cout<<pack<<endl;
int res=pack.to_ulong();
cout<<tar-pack.to_ulong()<<endl;
}
cout<<endl;
}
return 0;
}