zoukankan      html  css  js  c++  java
  • 二的幂次方(递归)

    描述 Description   

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

        137=2^7+2^3+2^0    

      同时约定方次用括号来表示,即ab 可表示为a(b)。

         由此可知,137可表示为:

           2(7)+2(3)+2(0)

      进一步:7= 2^2+2+2^0   (21用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+2^0

      所以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表示(在表示中不能有空格)

    输入格式 Input Format

            一个正整数

    输出格式 Output Format      

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

    样例输入 Sample Input

    73

    样例输出 Sample Output      

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

    递归操作题,个人感觉很是麻烦,关键还是在于对递归的理解程度。

    代码:

    #include <iostream>

    #include <iomanip>

    #include <cmath>

    #include <cstdio>

    #include <cstring>

    #include <ctime>

    #include <algorithm>

    using namespace std;

    int n;

    void pl(int n)

    {

              if(n==1) {cout<<"2(0)";return;}

              else if(n==2) {cout<<'2';return;}

              else

              {

                       int i=0,j=1;//以下操作,n为类似循环的边界的存在,当j比n大的时候开始/=2,只要n-j!=0就每次都输出加号,返回n-j;一直到j!=n时结束递归,其中对于i的递归为局部递归,为局部判定

                       while(1)

                       {

                                j*=2;

                                if(j>n)

                                {

                                          j/=2;

                                          if(i==1)

                                                   cout<<'2';

                                          else

                                          {

                                                   cout<<"2(";

                                                   pl(i);

                                                   cout<<')';

                                          }

                                          if(n-j!=0)

                                          {

                                                   cout<<'+';

                                                   pl(n-j);

                                          }

                                          return;

                                }

                                else

                                          i++;

                       }

              }

    }

    int main()

    {

              cin>>n;

              pl(n);

              return 0;

    }

  • 相关阅读:
    试试中文时间
    一道极限题目,难道不识别align*环境?
    一道求三元函数在空间区域上平均值的题目
    一道用单调有界证明的数列极限题目
    ORA-00119和ORA-00132报错
    安装mysql时提示This application requires .NET framework 4.5.2的解决办法
    Linux防火墙的开启关闭
    ORA-12541:TNS:无监听程序问题 解决办法
    卸载oracle11g
    Linux笔记
  • 原文地址:https://www.cnblogs.com/ywjblog/p/7631879.html
Copyright © 2011-2022 走看看