题目描述
任何一个正整数都可以用 22 的幂次方表示。例如 137=27+23+20137=27+23+20。
同时约定次方用括号来表示,即 abab 可表示为 a(b)a(b)。
由此可知,137137 可表示为 2(7)+2(3)+2(0)2(7)+2(3)+2(0)
进一步:
7=22+2+207=22+2+20 ( 2121 用 22 表示),并且 3=2+203=2+20。
所以最后 137137 可表示为 2(2(2)+2+2(0))+2(2+2(0))+2(0)2(2(2)+2+2(0))+2(2+2(0))+2(0)。
又如 1315=210+28+25+2+11315=210+28+25+2+1
所以 13151315 最后可表示为 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)。
输入格式
一行一个正整数 nn。
输出格式
符合约定的 nn 的 0,20,2 表示(在表示中不能有空格)。
输入输出样例
输入 #1复制
1315
输出 #1复制
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
说明/提示
【数据范围】
对于 100%100% 的数据,1≤n≤2×1041≤n≤2×104。
NOIP1998 普及组 第三题
思路
这道题可以通过递归来解决。
我们首先定义一个递归函数 solve(n)
,表示将正整数 n 用 2 的幂次方表示。
在递归函数中,我们首先处理递归终止条件,即当 n 等于 0 或者 1 时,直接返回对应的字符串。
然后,我们通过循环从 0 开始尝试不同的幂次方,即从 2^0 到 2^k,其中 k 是满足 2^k ≤ n 的最大整数。
对于每个幂次方 i,我们递归调用 solve(n - 2^i)
,得到一个表示 n - 2^i 的字符串。
接下来,我们将这个字符串与 2^i 拼接起来,并用括号括起来,即得到一个表示 n 的字符串。
最后,我们将所有的字符串拼接起来,以加号分隔,即得到最终的结果。
代码
点个赞再给个关注吧
#include <iostream>
#include <string>
using namespace std;
string solve(int n) {
if (n == 0) {
return "0";
}
if (n == 1) {
return "2(0)";
}
string result = "";
int i = 0;
while ((1<<i) <= n) {
if ((n & (1<<i)) != 0) {
if (result != "") {
result += "+";
}
if (i == 1) {
result += "2";
} else {
result += "2(" + solve(i) + ")";
}
}
i++;
}
return result;
}
int main() {
int n;
cin >> n;
string result = solve(n);
cout << result << endl;
return 0;
}