• 算法训练 2的次幂表示



    作者:秒针的声音
    时间:2015-3-28


    问题描述

      任何一个正整数都可以用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)

    提示
    用递归实现会比较简单,可以一边递归一边输出


    难点1:输出顺序,因为要从高位向地位输出所以此处选择转换为二进制的方法
    难点2:加号,也不算难,但是如果处理不当就是零分


    Gcc编译通过

    #include <stdio.h>
    /*因为数据规模20000,所以两个字节足够了*/
    #define N 16
    void fun(int n)
    {
       if(n==0){
        printf("2(0)");
        return;
       }else if(n==1){
        printf("2");
        return;
       }else if(n==2){
        printf("2(2)");
        return ;
       }
       /*进制转换*/ 
       int cnt=-1,ca=0;
       char a[N];
       for(;n;n=n/2){
        a[++cnt]=n%2;
       }
       /*主要函数体*/
       for(;cnt>=0;cnt--){
        if(a[cnt]){
            if(cnt<=2){
                fun(cnt);
            }else{
                printf("2(");
                fun(cnt);
                printf(")");
            }
            /*判断加号*/
            for(ca=cnt-1;ca>=0&&!a[ca];ca--);
            if(ca>=0){
                printf("+");
            }
        }
       }
    }
    int main(void)
    {
        int n;
        scanf("%d",&n);
        fun(n);
        return 0;
    }

    644B

    C

    正确

    100

    0ms

    784.0KB


  • 相关阅读:
    Docker 中 安装Redis
    k8s1.19.16 二进制安装
    K8S(kubernetes)+containerd部署指南
    npm install及其目录结构
    Caddy神奇: http服务免ssl证书改造为https
    gdb的set followforkmode child如何工作
    请求JAVA接口 一直返回 超时
    docker系列 可视化监控容器
    docker系列什么是docker
    docker系列 安装redis
  • 原文地址:https://www.cnblogs.com/pzqu/p/9457650.html
Copyright © 2020-2023  润新知