C-消减整数

消减整数

https://ac.nowcoder.com/acm/contest/11163/C

C-消减整数

解题思路: 从1开始减(设i为1),后面只能减 i 或者2* i,也就是说只能减2的倍数,那么如果一开始n为双数就得减两次i=1(题目要求第一次必须减1,为了确保n能到0所以需要保证n是双数),否则减一次。确保n为双数以后开始循环,如果能被i的两倍整除,那么就i* 2,否则就减自身i不变。用num作为计数器就好了。

#include<iostream>
#include<math.h>
typedef long long ll;
using namespace std;
int main()
{
    ll t,n,i,num;
    cin>>t;
    while(t--)
    {
        num=0,i=1;
        cin>>n;
        if(n%2==0)//如果开局是双数
        {
            num+=2;
            n-=2;//保证n是双数
        }
        else//如果是单数
        {
            num+=1;
            n-=1;//保证n是双数
        }
        while(n)//开始循环n
        {
            if(n%(i*2)==0)//如果能被i*2整除
            {
                i*=2;
                n-=i;
                num++;
            }
            else//否则
            {
                n-=i;
                num++;
            }
        }
        cout<<num<<endl;
    }
    return 0;
}
全部评论

相关推荐

3 收藏 评论
分享
牛客网
牛客企业服务