P1010
[NOIP1998 普及组] 幂次方
题目描述
任何一个正整数都可以用 \(2\) 的幂次方表示。例如 $137=27+23+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\)。
代码如下
#include <bits/stdc++.h>
using namespace std;
vector<int> cal(int n) {
vector<int> t;
int k = 0;
while (n) {
if (n & 1)
t.push_back(k);
k++;
n /= 2;
}
reverse(t.begin(), t.end());
return t;
}
void printl(int n) {
if (n == 0) {
cout << "2(0)";
} else if (n == 1) {
cout << 2;
}
}
void f(int n) {
if (n == 1) {
cout << "2(0)";
return;
} else if (n == 2 ) {
cout << "2";
return;
}
vector<int> x = cal(n);
for (int i = 0; i < x.size(); i++) {
if (i != 0 ) {
cout << "+";
if (x[i] <= 1)
printl(x[i]);
else {
cout << "2(";
f(x[i]);
cout << ')';
}
} else {
if (x[i] <= 1)
printl(x[i]);
else {
cout << "2(";
f(x[i]);
cout << ')';
}
}
}
}
int main() {
int n;
cin >> n;
f(n);
return 0;
}

浙公网安备 33010602011771号