• 幂次方(递归)


    链接:https://ac.nowcoder.com/acm/contest/1069/L

    题目描述

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

    输出描述:

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

    输入

    1315

    输出

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

    算法
    这道题目的算法就是递归,因为题目中的问题本身具有递归的特征。其实知道了这一点后,直接写一大块递归代码然后不停的debug,加一些if-else判断和循环调上一阵子也是可以过的,但是为了把代码写得清楚一点我还是分析了一下。

    分析
    137=128+8+1=27+23+20137=128+8+1=27+23+20
    7=4+2+1=22+2+207=4+2+1=22+2+20
    3=2+13=2+1
    从中我们可以看出来一点端倪,这并不是一层递归,而是两个递归结构的互相的,间接的递归,在代码上就反映为两个函数之间的调用与间接递归。
    这两个结构分别是
    2的幂次方=2^非2的幂次方
    非2的幂次方=2的幂次方+2的幂次方+···+2的幂次方
    所以写了两个函数mi是输出2的幂次方的,ci是输出非2的幂次方的。

    格式太难弄了,一直在改格式,看注释就知道了。。蒟蒻瑟瑟发抖

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <string>
     5 #include <math.h>
     6 #include <algorithm>
     7 #include <queue>
     8 const int INF=0x3f3f3f3f;
     9 using namespace std;
    10 
    11 void mi(int &n);
    12 void ci(int i);
    13 
    14 void ci(int i)
    15 {
    16     if(i==1)
    17     {
    18 //        printf(")");
    19         return;
    20     }    
    21     else if(i==0)
    22     {
    23         printf("0)");
    24         return;
    25     }
    26     else
    27     {
    28         int cnt=0;
    29         while(i)
    30         {
    31             if(cnt!=0)
    32                 printf("+");
    33             mi(i);
    34 //            printf(")");
    35             cnt++;
    36         }
    37     }
    38     printf(")");
    39     return ;    
    40 }
    41 
    42 void mi(int &n)
    43 {
    44     int i;
    45     for(i=0;;i++)
    46     {
    47         if(pow(2,i)>n)
    48         {
    49             i--;
    50             if(i!=1)
    51                 printf("2(");
    52             else
    53                 printf("2");
    54             ci(i);
    55             n-=pow(2,i);
    56 //            printf("2^%d ",i);
    57             break;
    58         }
    59         else if(pow(2,i)==n)
    60         {
    61             if(i!=1)
    62                 printf("2(");
    63             else
    64                 printf("2");
    65             ci(i);
    66 //            printf("2(");
    67 //            ci(i);
    68             n-=pow(2,i);
    69 //            printf("2^%d ",i);
    70             break;
    71         }
    72     }
    73     return;
    74 }
    75 
    76 int main()
    77 {
    78     int n;
    79     scanf("%d",&n);
    80     int cnt=0;
    81     while(n)
    82     {
    83         if(cnt!=0)
    84             printf("+");
    85         mi(n);
    86 //            printf(")");
    87         cnt++;
    88     }
    89 }
  • 相关阅读:
    Android高效加载大图、多图解决方案,有效避免程序OOM
    修改Eclipse中项目在Apache Tomcat中的部署路径
    解决用户绕过Servlet直接访问jsp页面
    Java中文件的上传与下载
    Android菜鸟的成长笔记(1)——Android开发环境搭建从入门到精通
    Linux学习(1)vi编辑器的常用命令
    怎样获取运行计划
    如​何​使​用​P​H​P​开​发​高​效​的​W​E​B​系​统
    网页抓取信息(php正則表達式、php操作excel)
    hdu1078 记忆化搜索
  • 原文地址:https://www.cnblogs.com/jiamian/p/11261752.html
Copyright © 2020-2023  润新知