将n变为一个可以被表示为2^{a}+2^{b}的正整数m
给出一个正整数n,需要将n变为一个可以被表示为+的正整数m,其中a和b都是非负整数且a!=b,你可以进行两种操作:
1.令n加1
2.令n减1
请你求出最少需要多少次操作才能将n变成满足条件的m。
输入格式
输入一个整数,代表n。
0≤n≤
输出格式
输出一个整数,代表需要的最少操作次数
测试样例一
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 <stdio.h>
#include <math.h>
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);
}