024 幂次方 (洛谷P1010)

1 篇文章 0 订阅
1 篇文章 0 订阅
  • 题目链接:P1010
  • 题目大意:
    任何一个正整数都可以用222的幂次方表示。例如
    137=27 + 23+20
    同时约定方次用括号来表示,即ab 可表示为a(b)。
    由此可知,137可表示为:
    2(7)+2(3)+2(0)
    进一步:
    7=22+2+20
    (21用2表示),并且 3=2+20
    所以最后137可表示为:
    2(2(2)+2+2(0))+2(2+2(0))+2(0)
    输入整数n(n≤20000),按上述形式表示n
  • 思路:
    第一遍想到的是打表的方法,既然数据这么小,就可以一位位取出来进行进行输出,可以从大到小直接输出,也可以按位法拼接字符串输出,下面给出的代码是利用前者。后来在学习别的代码的时候又习得了一种递归的思路,代码的实现稍有难度。
  • 代码:

打表:

#include <bits/stdc++.h>
using namespace std;
int n,k,a[16]{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
string s;
int main(){ 
    cin>>n;
    for(int i=15;i>=0;i--) 
        if(n>=a[i]){
            n-=a[i];
            if(k) printf("+");
            else k++;
            if(i==0) printf("2(0)");
            if(i==1) printf("2");
            if(i==2) printf("2(2)");
            if(i==3) printf("2(2+2(0))");
            if(i==4) printf("2(2(2))");
            if(i==5) printf("2(2(2)+2(0))");
            if(i==6) printf("2(2(2)+2)");
            if(i==7) printf("2(2(2)+2+2(0))");
            if(i==8) printf("2(2(2+2(0)))");
            if(i==9) printf("2(2(2+2(0))+2(0)");
            if(i==10) printf("2(2(2+2(0))+2)");
            if(i==11) printf("2(2(2+2(0))+2+2(0))");
            if(i==12) printf("2(2(2+2(0))+2(2))");
            if(i==13) printf("2(2(2+2(0))+2(2)+2(0))");
            if(i==14) printf("2(2(2+2(0))+2(2)+2)");
            if(i==15) printf("2(2(2+2(0))+2(2)+2+2(0))"); 
        }
}

递归:

#include<bits/stdc++.h>
using namespace std;
string run(int x,int i=0,string s=string("")){
    if(x==0)return string("0");
    do if(x&1)s=(i==1?"2":"2("+run(i)+")")+(s==""?"":"+")+s;
    while(++i,x>>=1);
    return s;
}
int main(){
    int x;cin>>x;
    cout<<run(x)<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值