提交WA,请dalao指导一下哪里有问题
若二进制下‘1’的数量达标,则输出‘0’; 若需要的‘1’的数量大于有效数字位数则全部填充为‘1’并作差; 否则从低位向高位0改1(1的数量少)或1改0(1的数量多)。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[65],b[65],c[65];
ll counts(ll x){
ll res=0,tmpd=x;
while (tmpd)
{
res += tmpd % 2;
tmpd /= 2;
}
return res;
}
int main(){
ll T;
scanf("%lld",&T);
while (T--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
ll x,k;
scanf("%lld %lld",&x,&k);
ll cnt1a=counts(x);
if(cnt1a == k){
printf("0\n");
continue;
}
ll pt=0,tmpx1=x;
while(tmpx1){
a[pt++] = tmpx1 % 2;
tmpx1 /= 2;
}
if(pt <= k){
ll ans = (1 << k) - 1 - x;
printf("%lld\n",ans);
continue;
}
if(cnt1a > k){
ll tmp1a=cnt1a;
for (ll i = 0; i < pt; i++)
{
if(tmp1a == k){
break;
}
if(a[i] == 1){
a[i]=0;
tmp1a--;
}
}
}else if(cnt1a < k){
ll tmp1a=cnt1a;
for (ll i = 0; i < pt; i++)
{
if(tmp1a == k){
break;
}
if(a[i] == 0){
a[i]=1;
tmp1a++;
}
}
}
ll ans=0;
for (ll i = 0; i < pt; i++)
{
if(i == 0){
ans += a[i] * 1;
}
ans += a[i] * pow(2,i);
}
printf("%lld\n",abs(ans-x));
}
return 0;
}