泥豪!我是2789617221guo!欢迎来到我的博客,你可以在这里|

2789617221guo

园龄:1个月粉丝:2关注:2

2025-02-20 13:43阅读: 4评论: 0推荐: 0

洛谷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记录

AC,15ms,600.00KB

提示

本题还可以进行位运算和 STL 函数优化,可以优化一点常数时间,在竞赛上尤为有用。但这里给出的普通写法代码已经足够通过本题,有兴趣的读者可以自行尝试使用位运算和 STL 函数(log2)优化。

本文作者:2789617221guo

本文链接:https://www.cnblogs.com/2789617221guo/p/18726419

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   2789617221guo  阅读(4)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起