将n变为一个可以被表示为2^{a}+2^{b}的正整数m

给出一个正整数n,需要将n变为一个可以被表示为2^{a}+2^{b}的正整数m,其中a和b都是非负整数且a!=b,你可以进行两种操作:

1.令n加1

2.令n减1

请你求出最少需要多少次操作才能将n变成满足条件的m。

输入格式

输入一个整数,代表n。
0≤n≤10^{9}

输出格式

输出一个整数,代表需要的最少操作次数

测试样例一
8
1
测试样例二
20
0
测试样例三
49
1

代码长度限制    16 KB

时间限制            400 ms

内存限制            64 MB

栈限制                8192 KB

: //加减一共有3种情况 第1种是2的a次方比n大 把剩下的n加到1 b为0
    //第2种是剩下的n与2的i-1次方最近 第3种剩下的n与2的i次方最近
    //有没有可能a与i-1或i相等后但是i-2或者i+1比第一种情况更小 测试点没有 代码也没有考虑

#include 
#include 
int main()
{
    int n;scanf("%d",&n);
    if (n<=1)    //n==0和1的情况特殊
    {
        printf("%d",3-n);
        return 0;
    }
//先把n减去2幂并且记录最大值a
    int a=0;
    while(n>(int)pow(2,a))//执行完之后2的a次方大于n
    {
         a++;
    }    
    a--;
    n=n-(int)pow(2,a);
//找需要进行加减的次数
    int num=0,i=0;
    for (;n>(int)pow(2,i);i++)
    ;
    if(n==(int)pow(2,i) && i!=a)
    {
        printf("0");
        return 0;
    }
    //加减一共有3种情况 第1种是2的a次方比n大 把剩下的n加到1 b为0
    //第2种是剩下的n与2的i-1次方最近 第3种剩下的n与2的i次方最近
    //有没有可能a与i-1或i相等后但是i-2或者i+1比第一种情况更小 测试点没有 代码也没有考虑
    if(((int)pow(2,i)-n) > n-(int)pow(2,i-1))
    {
        num=(int)pow(2,a+1)-(int)pow(2,a)-n+1;
        if(num > n-(int)pow(2,i-1) && i-1!=a)
            num=n-(int)pow(2,i-1);
    }
    else
    {
        num=(int)pow(2,a+1)-(int)pow(2,a)-n+1;
        if(num > (int)pow(2,i)-n && i!=a)
            num=(int)pow(2,i)-n;
    }
    printf("%d",num);
}

你可能感兴趣的:(c语言)