假设此题没有num2的影响,那么就可以计算num1二进制的1的个数,就是要操作的次数。
此时题中有num2,我们不妨从小到大枚举次数k,一次将所有次数的num2减去,再计算1的个数
k为操作的次数
此时再计算t中二进制1的个数,记为r。
t<0:则不可能有解
t<k:即使每次取最小2的0次方,k个1加起来都大于t,无解
当r==k,自然成立,每次都取不同的指数。r>k,无论怎么取,都不可能有r个1。r<k,两个1可以进位为一个1,所以当k>r时,也成立。
综上从小到大枚举答案,如果满足t>k且k>=r则k次操作就可以达到。
class Solution {
public:
int makeTheIntegerZero(int num1, int num2) {
long long k;
for(k=0;k<64;k++){ //long long的64位
long long t=num1-k*num2;
int r=0;
for(int j=0;j<64;j++)
if(t>>j&1) r++; //计算t的二进制1的个数
if(t>=k && r<=k) return k;
}
return -1;
}
};