C++双百模拟
解题思路
这题其实挺简单,就是统计num1-num2之后的数的二进制位为1的个数是否少于cnt。
举例:
cnt=1:3-(-2)=5->101(2>cnt)
cnt=2:5-(-2)=7->111(3>cnt)
cnt=3:7-(-2)=9->1001(2<cnt)
结束
原理很简单,因为根据二进制特性,num1-num2余下的必然为2的幂之和,只要该和的加数个数少于等于cnt,无论这个和是什么,我都可以用恰好cnt个数相加得到num1-num2。
注意:根据二进制位数,cnt不会超过32.
代码
###cpp
class Solution {
public:
int makeTheIntegerZero(int num1, int num2) {
int cnt=0;
long n1=num1,n2=num2;
while(1){
cnt++;
n1-=n2;
if(cnt<=n1&&__builtin_popcountll(n1)<=cnt)return cnt;
else if(n2>=-1&&n1<0)return -1;
}
return 0;
}
};