整数二进制的完全表示 递归方法
当我们将一个整数k表示为2的幂的和时,我们可以使用二进制表示来简化问题。例如,将10表示为2 + 8,我们可以将10表示为1010(二进制)。在这种表示中,每个1表示要加入和中的2的幂。
首先,我们检查k是否为0或1,如果是,则直接返回相应的字符串表示(“0"或"2(0)”)。
对于其他的k值,我们从高位到低位遍历二进制表示。对于每一位,如果该位为1,则将相应的2的幂的字符串表示添加到结果中。具体地说,如果当前位的索引为i,则我们将"2(" + solve(i) + ")"添加到结果中。如果当前位的索引为1,则我们将"2"添加到结果中。
在构建结果字符串时,我们还需要在每个2的幂之间添加"+"符号,除了第一个2的幂之外。
最后,我们返回构建的结果字符串。完整代码如下:
#include <iostream>
using namespace std;
string solve(int k) {
if (k == 0) {
return "0";
}
if (k == 1) {
return "2(0)";
}
string ans;
for (int i = 30; i >= 0; i--) {
if ((k >> i) & 1) {
if (!ans.empty()) {
ans += "+";//不为首部要加"+"号
}
if (i == 1) {
ans += "2";
}
else {
ans += "2(" + solve(i) + ")";
}
}
}
return ans;
}
int main() {
cout<<solve(135);
}
(k >> i) & 1这一句的底层逻辑是对整数k进行位运算操作。
首先,k >> i表示将k向右移动i位。这相当于将k的二进制表示向右移动i位。
然后,& 1表示对移动后的二进制表示进行与运算,其中1的二进制表示为0001。与运算的规则是,只有当两个操作数的对应位都为1时,结果才为1,否则为0。
135的递归流程图如下:
最后的代码运行结果图如下:
与上文流程图的结果一致