洛谷P1010 [NOIP 1998 普及组] 幂次方 题解
洛谷P1010 [NOIP 1998 普及组] 幂次方 题解
思路
使用一个函数 \(dfs\) 作为递归函数,传入一个参数 \(n\) 表示要分解 2 次幂的数。如果 \(n=1\),直接输出 \(2(0)\);如果 \(n=2\),输出 \(2\)。随后输出 \(2\),使用一个变量 \(lg\) 存储 \(\log_2{n}\),若\(lg\neq1\)(即 \(n>2\)),就先输出(,然后递归 \(dfs(lg)\)(因为要把 \(lg\) 也分解成 2 次幂形式),等递归结束后,把括号补全,输出)。攒函数末尾判断:如果 \(2^{lg}<n\)(即还没有分解完毕),就输出+,继续分解 \(dfs(n-2^{lg})\)
代码
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-8;
int n, pow2[205];
void dfs(int r) {
if(r == 1) {
cout << "2(0)";
return;
}
if(r == 2) {
cout << "2";
return;
}
int lg = 0;
for(lg = 0; lg <= 200; lg++) {
if(pow2[lg] <= r && pow2[lg + 1] > r) break;
}
cout << "2";
if(lg != 1) {
cout << "(";
dfs(lg);
cout << ")";
}
if(r > pow2[lg]) {
cout << "+";
dfs(r - pow2[lg]);
}
}
int main() {
pow2[0] = 1;
for(int i = 1; i <= 200; i++) pow2[i] = pow2[i - 1] * 2;
cin >> n;
dfs(n);
return 0;
}
AC记录
提示
本题还可以进行位运算和 STL 函数优化,可以优化一点常数时间,在竞赛上尤为有用。但这里给出的普通写法代码已经足够通过本题,有兴趣的读者可以自行尝试使用位运算和 STL 函数(log2)优化。

浙公网安备 33010602011771号