随笔- 509  文章- 0  评论- 151  阅读- 22万 

2014-03-19 05:57

题目:给定一个整数N,求出比N大,而且二进制表示中和N有相同个数的‘1’的最小的数,比如3是‘11’,接下来的5是‘101’,再接下来的6是‘110’。

解法:从低位往高位,首先跳过连续的‘0’,然后跳过连续的‘1’,并数数有多少个1。如果这时还没到最高位,那就从刚才跳过的‘1’中拿出1个放到这位上(当前位是‘0’),然后把剩下的‘1’填到最低的几位上去。中间填充‘0’。比如:‘100111000’的下一个是‘101000011

代码:

复制代码
 1 // 5.3 Find the next largest number that have same number of '1's with the given number.
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 unsigned int findNext(unsigned int n)
 6 {
 7     int n_zero;
 8     int n_one;
 9     
10     n_zero = 0;
11     while (n_zero < 32 && (n & (1 << n_zero)) == 0) {
12         ++n_zero;
13     }
14     if (n_zero == 32) {
15         // all 0
16         return n;
17     }
18     
19     n_one = n_zero;
20     while (n_one < 32 && (n & (1 << n_one)) != 0) {
21         ++n_one;
22     }
23     if (n_one  == 32) {
24         // no larger number is possible
25         return n;
26     }
27     
28     n = n >> n_one << n_one;
29     n |= (1 << n_one);
30     for (int i = 0; i < n_one - n_zero - 1; ++i) {
31         n |= (1 << i);
32     }
33     
34     return n;
35 }
36 
37 int main()
38 {
39     unsigned int n;
40     
41     while (scanf("%u", &n) == 1) {
42         printf("%u\n", findNext(n));
43     }
44     
45     return 0;
46 }
复制代码

 

 posted on   zhuli19901106  阅读(198)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示