P1010 幂次方

题目描述

任何一个正整数都可以用 2 的幂次方表示。例如 137=2^7+2^3+2^0

同时约定次方用括号来表示,即 a^b 可表示为 a(b)

由此可知,137 可表示为 2(7)+2(3)+2(0)

进一步:

7= 2^2+2+2^0  ( 2^1 用 2 表示),并且 3=2+2^0。

所以最后 137 可表示为 2(2(2)+2+2(0))+2(2+2(0))+2(0)。

又如 1315=2^{10} +2^8 +2^5 +2+1

所以 1315最后可表示为 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

解题思路

本题原理在于把一个数一直分解成2的n1次方的n2次方的……(直到出现2的1次方和2的0次方)相加的形式

递归就出现了

递归式

f(x) =  {x == 1 cout << "2(0)";

          {x == 2 cout << "2";

          {x == 3 cout << "2(0) + 2";

          {x >= 3 cout << "2(" ;

           f(n)(n是<=x的2的幂) ;

           cout << ")";

           if(x - n > 0) cout << "+";

                                f(x - n);

代码实现

不需要返回任何东西,所以用void,递归式如上

void f(int x) {
	if (x == 1) cout << "2(0)";
	if (x == 2) cout << "2";
	if (x == 3) cout << "2+2(0)";
	if (x > 3) {
		cout << "2(";
		int i = 15;//2^15 = 32,768 超出取值范围,可以使用
		while (pow(2, i) > x)i--;//求出n的值
		f(i);
		cout << ")";
		if (x - pow(2 , i) > 0) {
			cout << "+";
			f(x - pow(2, i));
		}
	}
}

完整代码

#include<bits/stdc++.h>
using namespace std;
void f(int x) {
	if (x == 1) cout << "2(0)";
	if (x == 2) cout << "2";
	if (x == 3) cout << "2+2(0)";
	if (x > 3) {
		cout << "2(";
		int i = 15;//2^15 = 32,768 超出取值范围,可以使用
		while (pow(2, i) > x)i--;
		f(i);
		cout << ")";
		if (x - pow(2 , i) > 0) {
			cout << "+";
			f(x - pow(2, i));
		}
	}
}
int main() {
	int n;
	cin >> n;
	f(n);
	return 0;
}

bye~~

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值