思想
首先我们可以看见n非常大,是1e9:
根据题面我们可以想到就已经大于1e9了
因此我们可以预处理一个power[]数组,这个数组存 ~ 的所有2幂数.
对于输入的n,我们就去遍历power数组,也就只需要遍历下标1~32而已.这是一个很小的量.然后对于每一个power[i]我们都将n与之相减取绝对值,最后看哪个值更小,说明n与哪个2幂数更亲近.
这个时候有两个情况,一个是n前面的2幂数,一个是n后面的2幂数,我们就要输出更小的那个二幂数.
#include<bits/stdc++.h>
#define int long long
#define IN 32
using namespace std;
int power[IN];
int minn=1e9+10;
signed main()
{
cin.tie(nullptr)->sync_with_stdio(0);
int x;cin>>x;
for(int i=1;i<=IN;i++)
{
power[i]=pow(2,i);
}
for(int i=1;i<=IN;i++)
{
int t=abs(x-power[i]);
minn=min(minn,t);
}
for(int i=1;i<=IN;i++)
{
int t1=x-minn;
int t2=x+minn;
if(t1==power[i] && t2==power[i])
{
cout<<t1;
break;
}
else if(t1==power[i])
{
cout<<t1;
break;
}
else if(t2==power[i])
{
cout<<t2;
break;
}
}
return 0;
}
评论区里的题解和我的想法一样但是代码更简洁: