Same binary weight (位运算)
2016-02-09 11:44
204 查看
题目描述
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
题解:
1717(0110 1011 0101),下一位是 1718(0110 1011 0110)
767(0010 1111 1111),下一位是 895(0011 0111 1111)
348(0001 0101 1100),下一位是 355(0001 0110 0011)
其中不难发现一个规律,从右起的第一个“01”改变为“10”,并且在“01”的后面所有的“1”都移动至最后,事实上,这个就是解题的关键点,那么整个问题求解的核心就转移到这两个子问题:
1. 将右起第一个“01”,改变为“10”
2. 将该“01”后面的所有“1”移动至最后
#include <cstdlib> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> #include <iostream> #include <vector> #include<string> #include<cstring> #include<string.h> #include<set> #include<queue> #include<stack> #include<map> using namespace std; typedef long long LL; int main() { int n; while(cin>>n) { int b=n&(-n);// 得到n中最后一个‘1’到最后的值 int t=n+b; // 产生进位, 实现‘01’ 变成 ‘10’ int s=t^n; // 得到进位中发生变动的位 int k=(s>>2)/b;//先 ‘01’->'10'发生后不要去改变这两位,所以右移2位,然后将‘01’以后的‘1’移动到最后。 int n=t|k; // 最后的结果就是t|k cout<<n<<endl; } return 0; }
相关文章推荐
- Android笔记activity的生命周期
- 在windows中批量修改文件名
- 加载plist数据和懒加载
- 线程同步、网络部分
- YTU 2509: 奇怪的分式
- HDU 2044 一只小蜜蜂... (递推)
- YTU 2508: 武功秘籍
- data.table包简介
- 注解,多线程
- 方言APP应用方言说使用指南
- 吊扇项目总结(四)— LCX24G无线模块
- YTU 2507: 李白打酒
- NLP系列(5)_从朴素贝叶斯到N-gram语言模型
- 吊扇项目总结(三)— 嵌入式软件架构MVC模式
- NLP系列(5)_从朴素贝叶斯到N-gram语言模型
- YTU 2506: 切面条
- [从头学数学] 第77节 可能性
- Dsniff and Arpspoof on Mac
- nmap
- 设计模式之门面模式