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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)