P1010 幂次方

大致题意:

  • 任何一个正整数都可以用2的幂次方表示,
  • 同时约定次方用括号来表示,
  • 并且把每一个指数都写成2的幂次方。

基本思路:

  • 深搜大气!深搜威武!深搜我爱你牛逼!
  • 咳咳,不中二了。
  • dfs(m)解决的就是m表示的2的幂次方。
  • 然后一层层套到最后就ok啦。

Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
using namespace std;
#define R read()
#define GC getchar()
#define ll long long
#define ull unsigned long long
#define INF 0x7fffffff
#define LLINF 0x7fffffffffffffff
ll read(){
    ll s=0,f=1;
    char c=GC;
    while(c<'0'||c>'9'){if(c=='-')f=-f;c=GC;}
    while(c>='0'&&c<='9'){s=s*10+c-'0';c=GC;}
    return s*f;
}
int n;
void dfs(int m){
    for(int i=14;i>=0;--i){//因为2^15大于n的最大数据,所以从14开始。至于为什么从大到小,因为根据题目描述都是从大的开始加的……
        int t=pow(2.0,i);//求出2^i次方(至于为什么要写成浮点数,因为写整数vscode会报错……
        if(t<=m){//如果可以剪掉
            if(i==0){//2^0就是2(0)
                printf("2(0)");
            }else if(i==1){//2^1就是2
                printf("2");
            }else{//因为2^i(i≠0,i≠1)的i需要拆分,直接套下去就好了
                printf("2(");
                dfs(i);
                printf(")");
            }
            m-=t;//减去ta
            if(m!=0){//如果等于0就说明已经弄完了,不用输出'+'了,不等于0就需要输出'+'
                printf("+");
            }
        }
    }
}
int main(){
    n=R;
    dfs(n);
    return 0;
}
原文地址:https://www.cnblogs.com/FUXyao/p/12885027.html