Flip the Bits Gym - 101810C——二进制处理

19 篇文章 1 订阅

 原题链接: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;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值