• (递归)8758:2的幂次方表示


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

    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)
    

    又如:

    1315=210+28+25+2+1
    

    所以1315最后可表示为:

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

    输入 
    一个正整数n(n≤20000)。

    输出 
    一行,符合约定的n的0,2表示(在表示中不能有空格)。

    样例输入 
    137

    样例输出 
    2(2(2)+2+2(0))+2(2+2(0))+2(0)

    我の思考 
    首先,要解决的问题是如何把输入的数字转为他们的2的幂次方,于是我选择了把数字转为二进制,然后来确定好它的情况。 
    而输出形式的处理,我们就判断它每一个字符的情况,如果是’(‘,’)’,’2’,’0’就直接输出,如果是其他的,在这里的情况就是其他需要被转型的数字了,我们就给它去转型。

    我の代码

    #include <iostream>
    #include <string>
    using namespace std;
    //转换为二进制形式
    string turnBinary(int num){
        string a="";
        string b="";
        int i;
        for(i=0;num>=1;i++){
            b+=char(num%2)+'0';
            num=num/2;
        }
        int len = b.length();
    
        for(i=len-1;i>=0;i--){
            if(i==1&&b[i]=='1'){
                a+="2+";
                continue;
            }
            if(b[i]=='1'){
                a+="2(";
                a+=(char(i)+'0');
                a+=")+";
            }
        }
        a[a.length()-1]='';
        return a;
    }
    //字符串变数字
    int turnNum(string a,int i){
        int sum=0;
        int j=i;
        for(;j<a.length();j++)
        {
            if(a[j]==')')
                break;
        }
        int num=1;
        for(j=j-1;i<=j;j--){
            sum+=(int(a[j]-'0')*num);
            num*=10;
        }
        return sum;
    }
    //判断递归
    void carry(string a,int i){
        if(i==a.length()){
            return;
        }
       if(a[i]=='('||a[i]==')'||a[i]=='+'||a[i]=='2'||a[i]=='0')
        {
            cout<<a[i];
            carry(a,i+1);
        }
        else{
            int num = turnNum(a,i);
            string after = turnBinary(num);
            a.replace(i,1,after);  //得到解析后的插入字符串中
            carry(a,i);   //继续解析转化后的字符串
        }
    }
    
    
    int main()
    {
        int num;
        cin>>num;
        string a="";
        a=turnBinary(num);
        carry(a,0);
        return 0;
    }

    我の小结 
    用了string来处理,还发现了string自带的很多很方便的函数。看了一下别人的代码好像都比我的短QAQ,后来去瞅了瞅老师的代码,发现自己处理确实是复杂了=_=。老师用一个

    inline int GetBit(int n,int i){
        return (n>>i)&1;
    }

    就很方便解决了二进制转化的问题(厉害QAQ),另外输出判断的时候也不用像我这样判断这么详细噗(/≧▽≦)/。

  • 相关阅读:
    问题描述:判断一个整数 n 是否为 2 的幂次方
    C#的关键字Explicit 和 Implicit
    .NET写入文件操作
    C# Main函数详解
    SpringBoot增加过滤XSS脚本攻击
    Hutool工具包导出Excel文件异常 You need to add dependency of poi-ooxml to your project
    微信H5表单点击输入框提示防欺诈盗号,请勿支付或输入qq密码
    RedisTemplate执行lua脚本在Redis集群模式下报错EvalSha is not supported in cluster environment.
    SpringBoot使用RedisTemplate+Lua脚本实现Redis分布式锁
    SpringBoot使用Thymeleaf打成jar包部署找不到页面
  • 原文地址:https://www.cnblogs.com/rimochiko/p/7486934.html
Copyright © 2020-2023  润新知