• 程序设计实习MOOC / 程序设计与算法(二)第二周测验(2018春季)


    递归算法:

    1:全排列

    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述

    给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。

    输入
    输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。
    输出
    输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:

    已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存在p (1 <= p <= k),使得
    s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。
    样例输入
    abc
    样例输出
    abc
    acb
    bac
    bca
    cab
    cba

    答案:

    #include <iostream>  
    #include <cstring> 
    using namespace std;  
    int n = 0;  
      
    void swap(char *a ,char *b)  
    {  
        int m ;  
        m = *a;  
        *a = *b;  
        *b = m;  
    }   
       
    void perm(char list[],int k, int m )  
    {  
        int i;  
        if(k >m)  
        {  
            for(i = 0 ; i <= m ; i++)  
            {  
                cout<<list[i];  
                   
            }  
            cout<<"
    ";  
            n++;  
        }  
        else  
        {  
            for(i = k ; i <=m;i++)  
            {  
                swap(&list[k],&list[i]);  
                perm(list,k+1,m);  
                swap(&list[k],&list[i]);  
            }  
        }  
    }  
      
    int main()  
    {  
        char list[50];
        cin.get(list,50);
        int len=strlen(list) - 1;
        perm(list,0,len);     
        return 0;  
    }  
    

    2:2的幂次方表示

    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述

    任何一个正整数都可以用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(n≤20000)。
    输出
    一行,符合约定的n的0,2表示(在表示中不能有空格)。
    样例输入
    137
    样例输出
    2(2(2)+2+2(0))+2(2+2(0))+2(0)

    来源NOIP1998复赛 普及组 第一题

    答案:

    #include<cstdio>  
    #include<cstdlib>  
    #include<cstring>  
      
    void f(int n)  
    {  
        if(n==1)  
        {  
            printf("2(0)");  
            return;  
        }  
        if(n==2)  
        {  
            printf("2");  
            return;  
        }  
        int p=1;  
        int s=0;  
        while(p<=n)  
        {  
            p=p*2;  
            s++;  
        }  
        s=s-1;  
        if(n==p/2)  
        {  
            printf("2(");  
            f(s);  
            printf(")");      
        }  
        else  
        {  
            if(p/2==2)  
            {  
                printf("2");  
                printf("+");  
                f(n-p/2);  
            }  
            else  
            {  
                printf("2(");  
                f(s);  
                printf(")+");  
                f(n-p/2);  
            }  
        }  
    }  
      
    int main()  
    {  
        int n;  
        scanf("%d",&n);  
        f(n);  
    }  
    

      

      

  • 相关阅读:
    自定义类似MessageBox小窗体操作
    WinForm 遍历用户控件里CheckBox
    WinForm BaseClass类常用通用方法
    分页的几种写法
    克服粗心毛病的伪代码
    C++queue的使用
    Unix网络编程学习 < 一 >
    使用log4cxx
    memset函数
    libcurl在windows下的使用
  • 原文地址:https://www.cnblogs.com/songqingbo/p/8657975.html
Copyright © 2020-2023  润新知