• 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
    
    
     
  • 相关阅读:
    c# 判断网络是否连接
    有关TSQL的10个好习惯
    相同文件只能一个进程读取
    我的单元测试方案
    又用了一把VBA
    深入理解字符串和字节数组转换
    如何清除应用程序承载 WebBrowser 控件时缓存
    VB也绿色
    ASP.Net网站开发的单元测试方案
    Nunit使用心得
  • 原文地址:https://www.cnblogs.com/rmy020718/p/8834661.html
Copyright © 2020-2023  润新知