zoukankan      html  css  js  c++  java
  • P1010 幂次方 递归模拟

      

    题目描述

    任何一个正整数都可以用22的幂次方表示。例如

    137=2^7+2^3+2^0137=27+23+20

    同时约定方次用括号来表示,即a^bab 可表示为a(b)a(b)。

    由此可知,137137可表示为:

    2(7)+2(3)+2(0)2(7)+2(3)+2(0)

    进一步:

    7= 2^2+2+2^07=22+2+20(2^1用2表示),并且

    3=2+2^03=2+20

    所以最后137137可表示为:

    2(2(2)+2+2(0))+2(2+2(0))+2(0)2(2(2)+2+2(0))+2(2+2(0))+2(0)

    又如:

    1315=2^{10} +2^8 +2^5 +2+11315=210+28+25+2+1

    所以13151315最后可表示为:

    2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

    输入输出格式

    输入格式:

    一个正整数n(n≤20000)n(n20000)。

    输出格式:

    符合约定的nn的0,20,2表示(在表示中不能有空格)

    输入输出样例

    输入样例#1: 复制
    1315
    输出样例#1: 复制
    2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)


    虽然是一道水题 但是搞了好久 而且代码写的一塌糊涂

    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);i--)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define inf 0x3f3f3f3f
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define N 12
    int flag1=1;
    int flag2=1;
    void put(int n)
    {
        int temp=1;
        while(temp<=n)temp*=2;
        temp/=2;
        flag2=flag1=1;
        while(temp)
        {
            if(temp&n)
            {
                if(temp>4)
                {
                if(flag1)flag1=0;
                else printf("+");
    
                    printf("2(");
                    put( log2(temp) );
                    printf(")");
                }
                else
                {
                if(flag2)flag2=0;
                else printf("+");
                    if(temp==1)
                        printf("2(0)");
                    else if(temp==2)
                        printf("2");
                    else if(temp==4)
                        printf("2(2)");
                }
            }
            flag1=0;
            temp>>=1;
        }
    }
    int main()
    {
        int n;
        RI(n);
        put(n);
        return 0;
    }
    View Code

    巨佬的题解

    #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;
    }
    View Code






  • 相关阅读:
    DOM_节点操作创建表格
    表单提交
    HTML常用标签
    网络通讯详解
    java===TCP(多线程多客户端同时上传字节数据:图片为例)
    java===TCP(文件上传功能)
    java===UDP
    java==IO=随机读写文件
    git中的基本命令
    ansible中roles的简单使用
  • 原文地址:https://www.cnblogs.com/bxd123/p/10665503.html
Copyright © 2011-2022 走看看