传送锚点:https://www.luogu.com.cn/problem/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)$。
输入格式
一行一个正整数 $n$。
输出格式
符合约定的 $n$ 的 $0, 2$ 表示(在表示中不能有空格)。
样例 #1
样例输入 #1
1315
样例输出 #1
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示
【数据范围】
对于 $100\%$ 的数据,$1 \le n \le 2 \times {10}^4$。
NOIP1998 普及组 第三题
思路
此题要将数字n转换为二进制表达,所以先求出n的二进制位数,在从b的二进制最高位开始遍历,如果遍历到倒数第2位,输出2,遍历到最后一位,输出2(0),否则继续递归(前提是该位为1)
code
#include <iostream>
using namespace std;
typedef long long ll;
void solve(int n){
int temp = n, sum = 0;//sum记录n的二进制位数
while(temp){
temp >>= 1;
sum++;
}
bool flag = true;//true代表是第一个数字
for(int i = sum - 1; i >= 0; i--){
if((n >> i) & 1){//n的第i位是1
if(flag) flag = false;
else cout << "+";
if(i == 1) cout << "2";//避免如3时 出现2(2(0) + 2(0)的情况
else if(i == 0) cout << "2(0)";
else cout << "2(", solve(i), cout << ")";
}
}
}
int main() {
int n;
cin >> n;
solve(n);
}