原题链接:https://codeforces.com/gym/101810/problem/C
You are given a positive integer n. Your task is to build a number m by flipping the minimum number of bits in the binary representation of nsuch that m is less than n (m < n) and it is as maximal as possible. Can you?
题意:
简单来说,就是输入一个十进制数,得到它的二进制形式,记录到第一个出现1的位置(从后往前);
例如:5的二进制是101,那么第一出现1的位置即使1;10的二进制是1010,第一次出现1的位置就是2.
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
const ll N = 2e5+10;
//计算一个数的二进制形式一共有多少个数字
int BitLength(unsigned int n)
{
int c = 0 ; // counter
while (n)
{
++c ;
n >>= 1 ;
}
return c ;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
int ans = 0;
int temp = BitLength(n);
for(int i=0; i<=temp; i++ )
{
int ret = (n>>i)&1;//得到数的二进制形式每一位上的数字,从后往前
ans++;
if(ret==1)
{
break;
}
}
cout<<ans<<endl;
}
return 0;
}