题目描述
任何一个正整数都可以用2的幂次方表示。例如:
137=2^7+2^3+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≤20000)
输出
符合约定的n的0,2表示(在表示中不能有空格)
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0) 代码如下
#include<bits/stdc++.h>//头文件
using namespace std;//
int x=0,p[16];//分别代表计数器,2的幂次方
bool f=true;//判断变量
void q(int n)//函数
{
int i;//循环变量
while(n)//n在不等于0时执行
{
for(i=x;i>=0;i--)//分解最大的二的幂次
{
if(p[i]<=n)//如果可以分解
{
n=n-p[i];//吧n减掉最大的二的幂次方
if(f)f=false;//判断是否可以加'+'号
else cout<<"+";//添加'+'号
if(i>1)//在分解的出的数不是2或1时
{
cout<<"2(";//输出二的...(没有完全输出完,还可以分解)
f=true;//可以添加'+'号
q(i);//再次调用函数(递归)
cout<<")";//完成括号
break;//跳出循环
}
if(i==1)cout<<"2";//如果分解的是2的1次方就输出2
if(i==0)cout<<"2(0)";//如果分解的是2的0次方就输出2(0)
}
}
}
}
int main()//主函数
{
int n;//要分解的数
cin>>n;//输入
p[0]=1;//将二的0次方设为1
while(p[x]<n)//循环到大于n的时候
{
x++;//计数器++
p[x]=p[x-1]*2;//将第x项设为前一项的2倍(2的幂次)
}
q(n);//调用函数
return 0;//结束程序
}
运行结果:
如有别的不会的问题私信给我