洛谷P1010幂次方
首先,我们来看这个题:
题目描述
任何一个正整数都可以用 2 的幂次方表示。例如 137=2^7+2^3+2^0137=27+23+20。
同时约定方次用括号来表示,即 a^b 可表示为 a(b)。
这个题,他是什么意思呢?
把一个数拆成二的幂相加的和,再把幂的顶数拆成二的幂相加的和,再把幂的顶数拆成二的幂相加的和......
直到这个数用0和2全部表示出来。
举个栗子:
137 可表示为 2(7)+2(3)+2(0)2(7)+2(3)+2(0)
进一步:
7= 2^2+2^1+2^0;( 2^1用 2 表示),并且 3=2+2^0
所以最后 137 可表示为 2(2(2)+2+2(0))+2(2+2(0))+2(0).
从题目中我们可以看出,这个题要用递归。
直接上代码:
#include<iostream>
#include<cmath>
using namespace std;
void o(int a){
for(int i=15;i>=0;i--){
if(a>=pow(2,i)){//先找出比a小的最大的二的次方
if(i==1){
cout<<"2";
}//把2^1先单独拎出来。如果i为1的话,直接输出2的1次方——2;
else if(i==0){
cout<<"2(0)";
}//再把2^0就是1拎出来。如果i=0的话,直接输出 2(0);
else{
cout<<"2(";//如果i既不等于1,也不等于0,那就先把左边框打出
o(i);//然后再递归
cout<<")";//最后输出右边框 ;
}
a-=pow(2,i);//把比a小的最大的二次方数减去
if(a!=0){//如果a不等于0,说明还能再拆,输出“+”
cout<<"+";
}
}
}
}
int main (){
int a;
cin>>a;
o(a);
return 0;
}
完结,撒花