zoukankan      html  css  js  c++  java
  • AOJ.综合训练.2016-12-8

    提示:多个题目的代码采用了C ++的写法,对应编译器选择G ++,请不要直接复制代码。

    下周实验考试,GOOD LUCK! 感谢汪神提供E题C语言代码

    所有题目已更新为C语言写法
    所有题目已更新为C语言写法
    所有题目已更新为C语言写法

    题目总览

    题号 题目 考察点 测试情况
    A 整数移位 2 模拟 AC 87 ms 464 KB
    B 约瑟夫环 模拟 AC 0 ms 492 KB
    C 重排字符 排序 string.h使用 AC 0 ms 492 KB ——> AC 0 ms 448 KB
    D 字符串 SET/MAP(STL)/数组 AC 0 ms 496 KB ——> AC 0 ms 444 KB
    E 生成全排列 递归/STL AC 146 ms 492 KB——> AC 131 ms 444 KB
    F 数组旋转 水题 AC 277 ms 532 KB
    G 对称数 回文串 AC 14 ms 468 KB

    A.整数移位 2

    题意分析

    模拟循环移位n次。这题AC rate 相当高,分析省(偷懒ing)。

    代码总览

    #include <stdio.h>
    #include <string.h>
    #define max 1005
    void get(char* str)
    {
        int len = strlen(str);
        int i;
        if(len <= 1)
            return;
        char temp = str[len-1];
        for(i=len-1; i>= 1; i--)
            str[i] = str[i-1];
        str[0] = temp;
    }
    void getn(char* str, int n)
    {
        int i;
        if(!str)
            return;
        for(i=1; i<= n; i++)
            get(str);
    }
    int main()
    {
        char str[max];
        int n;
        while(scanf("%s %d",str,&n) !=EOF){
            getn(str,n);
            printf("%s
    ",str);
        }
       // shift_n(str,2);
       // printf("%s",str);
        return 0;
    }
    

    B.约瑟夫环

    题意分析

    给出人数n和每m个人出局,几个人来回报数,报到m的话那个人出局,并且从1接着开始报数。求这几个人出局的顺序。模拟报数即可。
    用一个for循环来模拟报数,并且有计数器cnt,数组a,数组a用来模拟谁出局了,没出局a[i]=0,出局了a[i] = 1;每当找到一个a[i] = 0的时候,cnt++,表示1个人报数。直到cnt = m的时候,说明当前的人该出局了,将a[i]置为1,cnt初始化为0,输出i+1这个数字,并且将num++。每次循环先判断一下i是否等于n-1,若是表明该从第0个元素开始下一轮报数了;然后判断一下num是否等于n,若是,说明游戏里n个人都出局了,游戏结束。
    因为测试数据有多组,写一个empty函数,把数组归零。
    (这题是循环队列)

    代码总览

    #include <stdio.h>
    #define max  105
    int a[max];
    void empty(int a[],int n){
        int i;
        for(i = 0;i<n;i++){
            a[i] = 0;
        }
    }
    int main()
    {
        int n,m;
        while(scanf("%d %d",&n,&m) != EOF){
            int i,cnt = 0,num = 0,flag = 0;
            for(i = 0;i<n;i++){
                if(a[i] == 0){
                    cnt++;
                }
                if(cnt == m){
                    if(a[i] == 0){
                        if(flag == 0){
                            flag = 1;
                            printf("%d",i+1);
                        }else{
                            printf(" %d",i+1);
                        }
                        num++;
                        a[i] = 1;
                    }
                    cnt = 0;
                }
                if(i == n-1){
                    i=-1;
                }
                if(num == n){
                    printf("
    ");
                    break;
                }
            }
            empty(a,n);
        }
        return 0;
    }
    
    

    C.重排字符

    题意分析

    已更新C语言写法
    已更新C语言写法
    已更新C语言写法
    给出2个字符串,判断前一个是否为后一个的乱序。
    对2个字符串按ASCII排序(升序降序均可),然后比较,若相同则输出Yes,否则输出No.

    C语言:
    ①首先读入2个字符串
    ②通过sort函数分别对这2个字符串按照ASCII大小进行冒泡排序(当然这里也可以换成别的排序方法,插入排序,选择排序均可)。
    ③用strcmp函数比较这可两个字符串是否相等,若相等的话说明前一个即为后一个的乱序,否则就不是。注意,若相等strcmp函数返回值为0,否则为第一个不相等字符的ASCII之差。

    C++:
    使用string容器,用algorithm库里面的sort对每个字符排序,然后比较,判断即可。

    代码总览

    C语言版

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define max 500
    void sort(char * s)//②
    {
        int len = strlen(s);
        int i,j;
        for(i = 0;i<len-1;i++){
            for(j = 0;j<len-1-i;j++){
                if(s[j]>s[j+1]){
                    swap(&s[j],&s[j+1]);
                }
            }
        }
    }
    void swap(char *a,char*b)
    {
        char t;
        t = *a;
        *a = *b;
        *b = t;
    }
    int main()
    {
        char s1[max],s2[max];
        while(scanf("%s %s",s1,s2) != EOF){//①
            sort(s1);
            sort(s2);
            if(strcmp(s1,s2) == 0){//③
                printf("Yes
    ");
            }else{
                printf("No
    ");
            }
        }
        return 0;
    }
    

    C++版

    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    string s1,s2;
    int main()
    {
        cin.sync_with_stdio(false);
        cin.tie(0);
        while(cin>>s1>>s2){
            sort(s1.begin(),s1.end());
            sort(s2.begin(),s2.end());
            if(s1.compare(s2) == 0){
                cout<<"Yes"<<endl;
            }else{
                cout<<"No"<<endl;
            }
        }
        return 0;
    }
    

    D.字符串

    题意分析

    已更新C语言写法
    已更新C语言写法
    已更新C语言写法
    C写法参考汪神的思路
    给出2个字符串,判断他们是否有相同的字符构成。

    C语言:
    ①分别读入2个字符串
    ②通过get函数来统计他们的ASCII是否出现过,这里我还开了2个list数组,来记录他们的ASCII,若没出现过则为1,否则为0 (这里有优化的余地,因为ASCII 1-31均为控制字符,且32为空格,用%s是无法读入空白字符的,所以这里开128-32的数组就足够了,并且处理 的时候写s[i]-32即可,大家可以一试)
    ③通过judge函数来比对两个list是否每一位都相等,是的话说明他们均出现过,若有一位不相等,则说明他们有不同的字符。利用judge函数的返回值来输出对应结果。
    ④有多组数据,写clear函数清空2个list。

    C++:
    直接用map容器,对字符串每一个字符处理,处理完成后比对,如果查找的时候返回0说明不同,若查找均能找到,比较一下2个容器的size,size相同的话说明一定有相同字符构成。按照题目要求输出结果即可。

    代码总览

    C语言版

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define max 505
    #define lmax 128//②
    int list1[lmax],list2[lmax];//②
    void get(char*s,int list[])//②
    {
        int len = strlen(s);
        int i;
        for(i = 0;i<len;i++){
            list[s[i]] = 1;
        }
    }
    int judge(int list1[],int  list2[])//③
    {
        int i,flag = 1;
        for(i = 0;i<lmax;i++){
            if(list1[i] != list2[i]){
                flag = 0;
                break;
            }
        }
        return flag;
    }
    void clear(int list1[],int  list2[])//④
    {
        int i;
        for(i = 0;i<lmax;i++){
            list1[i] = list2[i] = 0;
        }
    }
    int main()
    {
        char s1[max],s2[max];
        while(scanf("%s %s",s1,s2) != EOF){//①
            get(s1,list1);
            get(s2,list2);//②
            if(judge(list1,list2)){//③
                printf("Yes
    ");
            }else{
                printf("No
    ");
            }
            clear(list1,list2);//④
        }
        return 0;
    }
    

    C++版

    #include <iostream>
    #include <map>
    #include <stdio.h>
    #include  <string.h>
    #define max 505
    using namespace std;
    typedef map<char,int> mp;
    mp p,q;
    int main()
    {
        char s1[max],s2[max];
        while(scanf("%s %s",s1,s2)!= EOF){
            int len = strlen(s1),i,flag = 0;
            for(i = 0;i<len;i++){
                p[s1[i]]++;
            }
            len = strlen(s2);
            for(i = 0;i<len;i++){
                q[s2[i]]++;
            }
            for(i = 0;i<len;i++){
                if(p.count(s2[i]) == 0){
                    flag = 1;
                    break;
                }
            }
            if(p.size() != q.size()){
                flag = 1;
    
            }
            if(flag == 0){
                printf("Yes
    ");
            }else{
                printf("No
    ");
            }
            p.clear();
            q.clear();
        }
        return 0;
    }
    

    E.生成全排列

    题意分析

    已更新C语言写法
    已更新C语言写法
    已更新C语言写法

    无奈又用了STL。汪神太强了,感谢汪神分享C的写法
    (本蒟蒻要好好学习一下了,等我拿个本先记上)

    代码总览

    C语言版

    #include<stdio.h>
    int n;
    int f[10],s[10];
    void make(int k)
    {
        if(k>n)
        {
            int i;
            for(i=1;i<n;++i) printf("%d ",s[i]);
            printf("%d
    ",s[n]);
            return ;
        }
        int i;
        for(i=1;i<=n;++i)
            if(!f[i])
            {
                s[k]=i;
                f[i]=1;
                make(k+1);
                f[i]=0;
            }
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            int i;
            for(i=0;i<10;++i) s[i]=f[i]=0;
            make(1);
        }
        return 0;
    }
    

    C++版

    #include <iostream>
    #include <stdio.h>
    #include <string>
    #include <algorithm>
    #define max 10
    using namespace std;
    int a[10];
    int main()
    {
        cin.sync_with_stdio(false);
        cin.tie(0);
        int n;
        while(cin>>n){
            int i;
            for(i = 0;i<n;i++){
                a[i] = i+1;
            }
            for(i = 0;i<n;i++){
                if(!i){
                    printf("%d",a[i]);
                }else{
                    printf(" %d",a[i]);
                }
            }
            printf("
    ");
            while(next_permutation(a,a+n)){
                for(i = 0;i<n;i++){
                    if(!i){
                        printf("%d",a[i]);
                    }else{
                        printf(" %d",a[i]);
                    }
                }
                printf("
    ");
            }
    
        }
        return 0;
    }
    

    F.数组旋转

    题意分析

    先按题目给出n保存到一个二维数组里,然后按二维数组从右到左,从上到下的顺序输出数组即可。

    代码总览

    #include <stdio.h>
    #define max 101
    int  a[max][max];
    int main()
    {
        int n;
        while(scanf("%d",&n) != EOF){
            int i,j;
            for(i = 0;i<n;i++){
                for(j = 0;j<n;j++){
                    scanf("%d",&a[i][j]);
                }
            }
            for(i = n-1;i>=0;i--){
                for(j = 0;j<n;j++){
                    if(j == 0){
                        printf("%3d",a[j][i]);
                    }else{
                        printf("%3d",a[j][i]);
                    }
    
                }
                printf("
    ");
            }
        }
        return 0;
    }
    

    G.对称数

    题意分析

    给出n,求出[1,n]中的满足下列要求的整数:这个数的平方本身是回文数。
    (回文数 比如 121,131,1331,123321,12321等等)
    数据范围不大int即可(我还是使用了 long long),把这个数的平方算出来,并且把他的每一位保存到数组里。对数组进行回文串判断,并设置标志变量flag。根据flag判断是否为回文串。

    代码总览

    #include <stdio.h>
    #define max 1001
    int a[max];
    int main()
    {
        long long   temp,temp1;
        int n;
        while(scanf("%d",&n)!= EOF){
            int i;
            for(i = 1;i<=n;i++){
                temp1 = temp = i * i;
                int k = 0,j,judge = 0;
                while(temp1){
                    a[k] = temp1%10;
                    temp1/= 10;
                    k++;
                }
                for(j = 0;j<k/2;j++){
                    if(a[j] != a[k-1-j]){
                        judge = 1;
                        break;
                    }
                }
                if(!judge){
                    printf("%2d%11lld
    ",i,temp);
                }
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    页面模板
    HTML,CSS,JaveScript
    TCP三次握手
    BLDC无刷直流电机的原理及驱动基础
    调试日志——基于stm32的智能声光报警器(三)
    调试日志——基于stm32的智能声光报警器(二)
    调试日志——基于stm32的智能声光报警器(一)
    Jlink-10 pin 的定义(stm32使用)官方定义
    关于学习新知识的一点想法
    前端笔记-javaScript-3
  • 原文地址:https://www.cnblogs.com/pengwill/p/7367187.html
Copyright © 2011-2022 走看看