洛谷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)优化。

posted @ 2025-02-20 13:43  2789617221guo  阅读(90)  评论(0)    收藏  举报