洛谷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;
}

完结,撒花

posted @ 2020-05-15 16:25  王佳琳  阅读(161)  评论(0编辑  收藏  举报