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;
}
posted @ 2023-11-02 20:04  hey在干嘛  阅读(20)  评论(0)    收藏  举报