• 算法训练 2的次幂表示


    算法训练 2的次幂表示  
    时间限制:1.0s   内存限制:512.0MB
       
    问题描述
      任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
      将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0
      现在约定幂次用括号来表示,即a^b表示为a(b)
      此时,137可表示为:2(7)+2(3)+2(0)
      进一步:7=2^2+2+2^0 (2^1用2表示)
      3=2+2^0
      所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
      又如:1315=2^10+2^8+2^5+2+1
      所以1315最后可表示为:
      2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
    输入格式
      正整数(1<=n<=20000)
    输出格式
      符合约定的n的0,2表示(在表示中不能有空格)
    样例输入
    137
    样例输出
    2(2(2)+2+2(0))+2(2+2(0))+2(0)
    样例输入
    1315
    样例输出
    2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
    提示
      用递归实现会比较简单,可以一边递归一边输出



    思路:

    把数字转换成为二进制时不用反转,直接下标从最高位开始比较方便,只有最后为0,1,2的时候进行特殊处理就可以,也就是递归出口。其他的情况全部用递归实现就可以了。


    代码:

    #include<iostream>
    #include<string>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    string binary(int num)
    {
        string s="";
        while(num)
        {
            if(num%2)s+="1";
            else s+="0";
            num/=2;
        }
        return s;
    }
    void slove(string s)
    {
        int len=s.length();
        for(int i=len-1;i>=0;i--)
        {
            if(s[i]=='0')
                continue;
            if(i>2)
            {
                printf("2(");
                string str=binary(i);
                slove(str);
                printf(")");
                int flag=0;
                for(int j=i-1;j>=0;j--)
                    if(s[j]=='1')
                    {
                        flag=1;
                        break;
                    }
                if(flag)
                    printf("+");
            }
            else if(i==2)
            {
                printf("2(2)");
                if(s[i-1]=='1'||s[i-2]=='1')printf("+");
            }
            else if(i==1)
            {
                printf("2");
                if(s[i-1]=='1')printf("+");
            }
            else if(i==0)
                printf("2(0)");
        }
    }
    int main()
    {
        int num;
        scanf("%d",&num);
        string s=binary(num);
        slove(s);
        printf("
    ");
        return 0;
    }
    


  • 相关阅读:
    AD域渗透测试笔记
    ctf之WEB练习一
    CTF之crpto练习三
    ctf之WEB练习二
    ctf之WEB练习三
    [转]Ant学习笔记——自己构建Ant编译环境
    [转]【NoSQL】NoSQL入门级资料整理(CAP原理、最终一致性)
    啥叫异步调用
    C++中虚函数的作用是什么?它应该怎么用呢?
    [转]Thrift连接池实现
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/7776032.html
Copyright © 2020-2023  润新知