Same binary weight(stl 位运算)

Same binary weight

时间限制: 300 ms  |  内存限制: 65535 KB
难度: 3
描述

The binary weight of a positive  integer is the number of 1's in its binary representation.for example,the decmial number 1 has a binary weight of 1,and the decimal number 1717 (which is 11010110101 in binary) has a binary weight of 7.Give a positive integer N,return the smallest integer greater than N that has the same binary weight as N.N will be between 1 and 1000000000,inclusive,the result is guaranteed to fit in a signed 32-bit interget.

输入
The input has multicases and each case contains a integer N.
输出
For each case,output the smallest integer greater than N that has the same binary weight as N.
样例输入
1717
4
7
12
555555
样例输出
1718
8
11
17
555557
来源

topcoder

题目大意: 找出与目标数二进制含1数相同且比之大的最小数

解题思路:

stl 有个bitset, 可以对数进行按位操作, 只要把从低位起找到第一个1后再找到的第一个零变成1, 再把途中的1的个数减1个1放到最低位即可(不大好表述。。。), 例如101110011100->101110100011。

#include <stdio.h>
#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    int temp, i, j, count;                     //临时变量, 临时变量, 临时变量, 计数器
	while(scanf("%d", &temp) != EOF)
	{
		count = 0;
	    bitset<32> ans;                         
		i = 0;
        while(temp > 0)                         //将temp转化为bitset二进制保存以便操作
		{
		    ans[i] = temp & 1;                 
			temp /= 2;
			i++;
		}
        i = 0;
		while(ans[i] == 0)
		{
		    i++;
		}
		while(ans[i] == 1)                     //找到第一个1开始计数
		{
		    ans[i] = 0;                        //将途中的1变为零
			count++;
			i++;
		}
		count--;                                //多加了一个1, 减去
        ans[i] = 1;                              //1以后第一个零变为1
		j = 0;
		while(count > 0)
		{
		    if(ans[j] == 0)
			{
			    ans[j] = 1;                      //从低位开始加1
				count--;
			}
			j++;
		}
		cout<<ans.to_ulong()<<endl;               //用to_ulong 转化为十进制输出
	} 
	return 0;
}        


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值