简单的贪心
对于n的二进制数,找到下标 x , x对应的二进制为1, x + 1 位对应的二进制为0,
并且统计 0 ~ x 位之间有 cnt_1 个 1, 那么所求的答案就是 n 减去 这 cnt_1 个1
累加的值,再加上二进制值 2(11…1), 这里有 (cnt_1 - 1) 个 1
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int n;
void solve()
{
int cnt_1 = 0, mark_n = n;
for(int i = 0; i < 30; ++i)
{
int a = n >> i, b = n >> (i + 1);
if((a & 1) == 1)
{
++cnt_1;
mark_n -= 1 << i;
}
if((a & 1) == 1 && (b & 1) == 0)
{
mark_n += 1 << (i + 1);
break;
}
}
for(int i = 0; i < cnt_1 - 1; ++i)
{
mark_n += 1 << i;
}
printf("%d\n", mark_n);
}
int main()
{
while(scanf("%d", &n) != EOF && n)
{
solve();
}
return 0;
}
/*
1
2
3
4
78
0
*/
/*
2
4
5
8
83
*/