题目描述
任何一个正整数都可以用 的幂次方表示。例如 。
同时约定方次用括号来表示,即可表示为。
由此可知,可表示为。
进一步:
( 用 表示),并且 。
所以最后 可表示为 。
又如
所以 最后可表示为 。
输入格式
一行一个正整数 。
输出格式
符合约定的 的 表示(在表示中不能有空格)。
样例
样例输入1
1315
样例输出1
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
说明/提示
【数据范围】
对于 的数据,。
思路描述
首先这是把一个数拆解直到剩下0,2。
而我们拆解一次还不够,因为像样例一中的1315一样,有多个循坏嵌套。
所以到这里就很明了了。
用递归
首先我们先遍历最大的幂次。题目中给了。所以他不超过幂。
我们用循坏遍历从14一直到0
一段一段拆解。
直到最后只能剩下时这一轮拆解才算结束
但有时候拆解不干净
会剩下一点点
所以我们再输出把剩下的减干净
这一道题就完成了
AC代码
#include<bits/stdc++.h>
using namespace std;
int n; //数字
void fun(int n){
for (int i = 14 ; i >= 0 ; i --){ //遍历所有情况
if (pow(2,i) <= n){ //检测可不可以减
if (i == 0) cout << "2(0)"; //如果只剩下1
else if (i == 1) cout << "2"; //如果剩下2
else{ //继续分解
cout << "2(";
fun(i); //进行下一轮
cout << ")";
}
n -= pow(2,i); //分解完毕
if (n != 0) cout << "+"; //还有没减干净的
}
}
}
int main(){
cin >> n;
fun(n); //执行程序
return 0;
}
制作不易,素质三连(bushi)