zoukankan      html  css  js  c++  java
  • luogu P1010 幂次方

    题目描述

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

    输入输出格式

    输入格式:

    一个正整数n(n≤20000)。

     

    输出格式:

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

    输入输出样例

    输入样例#1:
    1315
    输出样例#1:
    2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

    看到这个题正解明显的递归
    解法一之递归:
    用一个递归为mi,找到n-2^i最小,判断:
      i==0: printf("2(0)");
      i==1: printf("2");
      i==2: printf("2(2)");
      如果i>2,则调用递归:mi(i)
      上面做完后,判断n-2^i是否为0,不为0则调用递归:mi(n-2^i)。
    代码来咯:
    #include <cstdio>
    #include <cstdlib>
    #include <stdio.h>
    using namespace std;
    
    long n;
    
    int mi(int m){
        int i=0,t=1;
        while (t*2<=m){
            t=t*2;
            i=i+1;
        }
        if (i==0) printf("2(0)");
        if (i==1) printf("2");
        if (i==2) printf("2(2)");
        if (i>2) {
            printf("2("); mi(i); printf(")");
        }
        if (m-t>0) {
            printf("+");
            mi(m-t);
        }
    }
    
    int main(){
        scanf("%d",&n);
        mi(n);
        return 0;
    }

    解法二打表枚举:

    n既然<=20000,2的16次方貌似就超了吧,所以可以吧这些数每一位一位的拆开,打个16个情况的表,照例输出就好了。
    (打表虽然比较low但总比递归调不出来,木有分好吧)
    代码:
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    int main()
    {
        int n,m,k=0,a[100000];
        cin>>n;
        while(n>0)
        {
            for(int i=0; i<=15; i++)
            {
                m=pow(2,i);
                if(m>=n)
                {
                    if(m==n)
                    {
                        n=n-m;
                        k++;
                        a[k]=i;
                    }
                    if(m>n)
                    {
                        n=n-pow(2,i-1);
                        k++;
                        a[k]=i-1;
                    }
                    break;
                }
            }
        }
        if(a[1]==0)cout<<"2(0)";
        if(a[1]==2)cout<<"2(2)";
        if(a[1]==3)cout<<"2(2+2(0))";
        if(a[1]==4)cout<<"2(2(2))";
        if(a[1]==5)cout<<"2(2(2)+2(0))";
        if(a[1]==6)cout<<"2(2(2)+2)";
        if(a[1]==7)cout<<"2(2(2)+2+2(0))";
        if(a[1]==8)cout<<"2(2(2+2(0)))";
        if(a[1]==9)cout<<"2(2(2+2(0))+2(0))";
        if(a[1]==10)cout<<"2(2(2+2(0))+2)";
        if(a[1]==11)cout<<"2(2(2+2(0))+2+2(0))";
        if(a[1]==12)cout<<"2(2(2+2(0))+2(2))";
        if(a[1]==13)cout<<"2(2(2+2(0))+2(2)+2(0))";
        if(a[1]==14)cout<<"2(2(2+2(0))+2(2)+2)";
        if(a[1]==1)cout<<"2";
        for(int i=2; i<k; i++)
        {
            if(a[i]==0)cout<<"+2(0)";
            if(a[i]==2)cout<<"+2(2)";
            if(a[i]==3)cout<<"+2(2+2(0))";
            if(a[i]==4)cout<<"+2(2(2))";
            if(a[i]==5)cout<<"+2(2(2)+2(0))";
            if(a[i]==6)cout<<"+2(2(2)+2)";
            if(a[i]==7)cout<<"+2(2(2)+2+2(0))";
            if(a[i]==8)cout<<"+2(2(2+2(0)))";
            if(a[i]==9)cout<<"+2(2(2+2(0))+2(0))";
            if(a[i]==10)cout<<"+2(2(2+2(0))+2)";
            if(a[i]==11)cout<<"+2(2(2+2(0))+2+2(0))";
            if(a[i]==12)cout<<"+2(2(2+2(0))+2(2))";
            if(a[i]==13)cout<<"+2(2(2+2(0))+2(2)+2(0))";
            if(a[i]==14)cout<<"+2(2(2+2(0))+2(2)+2)";
            if(a[i]==1)cout<<"+2";
        }
    }
    View Code
    
    
     
  • 相关阅读:
    Atitit 人脸识别 眼睛形态 attilax总结
    Atitit 手机号码选号 规范 流程 attilax总结 v2 r99.docx
    atitit 板块分类 上市公司 龙头企业公司 列表 attilax总结.docx
    Atititi atiitt eam pam资产管理 购物表去年.xlsx
    使用cmd查看电脑连接过的wifi密码(一)
    常见十大web攻击手段 悟寰轩
    常见web攻击方式 悟寰轩
    【MYSQL数据库】MYSQL学习笔记mysql分区基本操作 悟寰轩
    Filter及FilterChain的使用详解 悟寰轩
    启动tomcat spring初始化两次问题(eg:@PostConstruct) 悟寰轩
  • 原文地址:https://www.cnblogs.com/rmy020718/p/8834661.html
Copyright © 2011-2022 走看看