【整数二进制的完全表示 递归方法】

整数二进制的完全表示 递归方法

当我们将一个整数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的递归流程图如下:
在这里插入图片描述
最后的代码运行结果图如下:
在这里插入图片描述
与上文流程图的结果一致

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诚勤的桃某光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值