洛谷p1010 幂次方

采用最土的办法<一堆if>来输出“(”和“+”      ,仅限数据不大时可以使用

下面是我的完整代码:

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;

int Fun(int n){
    if(n==0){
        return 1;
    }
    else{
        return 2*Fun(n-1);
    }
}

int bijiao(int n){   //返回2的多少次方
    if(n==0){
        return -1;
    }
    for(int i=0;i<16;i++){  //确保值大于2乘10的4次方
        if(Fun(i)>n){
            return i-1;
        } 
    }
    return -1;
}

int main(){
    int n;
    cin>>n;
    int dp[15]={0};
    vector<vector<int>>arr(15,vector<int>(5));
    int Max=bijiao(n);
    
    while(1){
        if(Max==-1){
            break;
        }
        n-=Fun(Max);
        dp[Max]=1;
        Max=bijiao(n);  
    }

    for(int i=0;i<15;i++){
        if(dp[i]==1){
            int n=i;
            int Max=bijiao(n);
            while(1){
                if(Max==-1){
                    break;
                }
                n-=Fun(Max);
                arr[i][Max]=1;
                Max=bijiao(n);  

            }
            
        }
        
    }
    

    int last=14;
    for(int i=14;i>=0;i--){
        if(dp[i]==1){
            if(i<=last){
                last=i; //找到最后一位
            }
        }
    }
    
    for(int i=14;i>last;i--){
        if(dp[i]==1){
            if(i==14)  cout<<"2(2(2+2(0))+2(2)+2)+";
            if (i==13) cout<<"2(2(2+2(0))+2(2)+2(0))+";
            if (i==12) cout<<"2(2(2+2(0))+2(2))+";
            if (i==11) cout<<"2(2(2+2(0))+2+2(0))+";
            if (i==10) cout<<"2(2(2+2(0))+2)+";
            if (i==9)  cout<<"2(2(2+2(0))+2(0)+";
            if (i==8)  cout<<"2(2(2+2(0)))+";
            if (i==7)  cout<<"2(2(2)+2+2(0))+";
            if(i==6)   cout<<"2(2(2)+2)+";
            if(i==5)   cout<<"2(2(2)+2(0))+";
            if(i==4)   cout<<"2(2(2))+";
            if(i==3)    cout<<"2(2+2(0))+";
            if(i==2)   cout<<"2(2)+";
            if(i==1)   cout<<"2+";
            

        }
    

    
    }
    
      
    if(last==14&&dp[14]==1)cout<<"2(2(2+2(0))+2(2)+2)";
    if(last==13&&dp[13]==1) cout<<"2(2(2+2(0))+2(2)+2(0))";
    if(last==12&&dp[12]==1) cout<<"2(2(2+2(0))+2(2))";
    if(last==11&&dp[11]==1) cout<<"2(2(2+2(0))+2+2(0))";
    if(last==10&&dp[10]==1) cout<<"2(2(2+2(0))+2)";
    if(last==9&&dp[9]==1)  cout<<"2(2(2+2(0))+2(0)";
    if(last==8&&dp[8]==1)  cout<<"2(2(2+2(0)))";
    if(last==7&&dp[7]==1)   cout<<"2(2(2)+2+2(0))";
    if(last==6&&dp[6]==1)   cout<<"2(2(2)+2)";
    if(last==5&&dp[5]==1)   cout<<"2(2(2)+2(0))";
    if(last==4&&dp[4]==1)   cout<<"2(2(2))";
    if(last==3&&dp[3]==1)   cout<<"2(2+2(0))";
    if(last==2&&dp[2]==1)   cout<<"2(2)";
    if(last==1&&dp[1]==1)   cout<<"2";
    if(last==0&&dp[0]==1)   cout<<"2(0)";

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值