问题描述
任何一个正整数都可以用2的幂次方表示。例如:
137=2^7+2^3+2^0
同时约定方次用括号来表示,即ab 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 2^2+2+2^0 (21用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<=20000),为要求分解的整数。
输出格式
程序输出包含一行字符串,为符合约定的n的0,2表示(在表示中不能有空格)
分析:
看数据规模N<=20000,可以用一个数组存放2的0次幂到16次幂,减少计算量。
首先,正整数中只有1,2不用二次拆分,1=2(0),2=2,直接输出即可;
其次,n>2都需要二次拆分,第一次拆分如137,拆分为2(7)+2(3)+2(0),要实现这一步拆分需要
① 若n不是2的整数幂,找到比n大的最小指数幂a[i],从a[i-1] 开始拆分;若是,直接拆分a[i]=n。
② 对a[i-1] 或a[i] 进行二次拆分,二次拆分就相当于再进行一次拆分。
③ 做完①②步之后2(7)就被完整的拆分成2(2(2)+2+2(0))形式,此时只需要继续拆分 [n-a[i-1] 或n-a[i] ]即可得到+2(3)+2(0)。
细节:为防止2被拆分成2(0)形式,需要判断a[i]或a[i-1]==2,若是,不再对2进行二次拆分。
代码:
#include <iostream>
using namespace std;
int a[16]={
1,