[NOIP1998 普及组] 幂次方
问题描述
给定一个正整数 n n n,我们希望找到一种方式,将它表示为 2 2 2 的幂次方的和。例如,对于 137 137 137,可以表示为 2 7 + 2 3 + 2 0 2^7+2^3+2^0 27+23+20,或者按照约定的方式 2 ( 7 ) + 2 ( 3 ) + 2 ( 0 ) 2(7)+2(3)+2(0) 2(7)+2(3)+2(0)。
用括号来表示幂次方,即 a b a^b ab 可以表示为 a ( b ) a(b) a(b)。例如, 7 7 7 可以表示为 2 2 + 2 + 2 0 2^2+2+2^0 22+2+20,其中 2 1 2^1 21 用 2 2 2 表示,这可以写成 2 ( 2 + 2 ( 0 ) ) + 2 2(2+2(0))+2 2(2+2(0))+2。
解决方法
使用递归的方式来解决这个问题。首先找到最大的 2 k 2^k 2k,其中 k k k 是满足 2 k ≤ n 2^k \leq n 2k≤n 的最大整数。然后将 n n n 表示为 2 k 2^k 2k 和一个小于 2 k 2^k 2k 的余数的和。这个过程可以递归进行,直到余数为 0 0 0。
#include<iostream>
using namespace std;
void search(int n) {
if (n != 0) {
int i = 1, q = 0;
while (i <= n) {
i *= 2;
q++;
}
q--;
i /= 2;
if (q == 0 || q == 2)
cout << "2(" << q << ")";
else if (q == 1)
cout << "2";
else {
cout << "2(";
search(q);
cout << ")";
}
n -= i;
if (n != 0) {
cout << "+";
search(n);
}
}
}
int main() {
int n;
cin >> n;
search(n);
return 0;
}
输入与输出
输入是一个正整数 n n n,表示我们要表示的数。
输出是满足约定的 n n n 的表示,其中没有空格。
示例
输入示例
1315
输出示例
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)