zoukankan      html  css  js  c++  java
  • 算法训练 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;
    }
    


  • 相关阅读:
    在c++代码中执行bat文件 【转】
    华为交换机限速配置命令2016
    zabbix报错listener failed: zbx_tcp_listen() fatal error: unable to serve on any address
    shell脚本中执行mysql 语句,去除warning using a password on the command line interface can be insecure信息
    zabbix_get :command not found 解决办法
    CentOS7 升级到7.4
    jumpserver v0.5.0 创建用户和管理机器
    zabbix触发的多条件判断表达式
    nginx 配置一个文件下载服务
    ECS 实例网络带宽
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/7776032.html
Copyright © 2011-2022 走看看