总时间限制:
1000ms
内存限制:
65536kB
描述
任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+20
同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7=22+2+20(21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=210+28+25+2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
输入
一个正整数n(n≤20000)。
输出
一行,符合约定的n的0,2表示(在表示中不能有空格)。
样例输入
137
- 1
- 2
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
- 1
- 2
来源
NOIP1998复赛 普及组 第一题
每一个数都可以分解为2的x次幂加上另外一个数- 然后依次递归将x和另外的一个数分解
最后的结果都可以归结为1,2,3三种情况将这三种情况作为程序的结束点
#include <iostream>
#include <cmath>
using namespace std;
int maxNum=142; //2^142>20000
void micifang(int n);
int main()
{
int n;
cin >> n;
micifang(n);
return 0;
}
void micifang(int n)
{
if(n==1){
cout << "2(0)";
return;
}
if(n==2){
cout << "2";
return;
}
if(n==3){
cout << "2+2(0)";
return;
}
for(int i=0;i<maxNum;i++){
if( n>=pow(2,i) && n<pow(2,i+1)){
cout << "2(";
micifang(i);
cout << ")";
if(n-pow(2,i)>0){
cout << '+';
micifang(n-pow(2,i));
}
}
}
}