ZZULIOJ:1171-1180

目录

1171: 加密(指针专题) 

1172: 矩阵边界和(指针专题) 

1173: 密码解密(指针专题) 

1174: 长整数排序(指针专题)

1175: 矩阵转置(指针专题) 

1176: 查找最大字符串(指针专题) 

1177: 按要求排序(指针专题) 

1178: 单词数 

1179: 带参宏定义(函数专题) 

1180: 成绩统计(结构体专题)


1171: 加密(指针专题) 

题目描述

将一段明文加密。加密的规则如下:将每个字符的ascii码的值减去24作为每个字符加密后的值,例如'a'的ascii码的值为97,那么加密后就变成了73。"73"就是'a'的密文,例如,字符串"abc",在加密之后变为"737475",最后,整个密文再进行翻转,得到最终的密文"574737"。现在请你编写程序,对一段文字加密。请定义并使用如下函数:
void encrypt(char *plain, char *cipher)
{
//把原文字符串plain加密后存入字符串cipher
}

输入

输入一串字符串,只包含数字和字母,最长为200.

输出

输出加密后的字符串。

样例输入 Copy
zero12
样例输出 Copy
625278097789
提示

直接输出密文当然是最简单的方法,不过本题要求你将密文存入字符串(以备程序的其它模块使用)。

源代码 

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    string s;
    getline(cin,s);
    string ans;
    for(int i = 0;i < s.size();i ++ )
    {
        string t = to_string(int(s[i]) - 24);
        ans = ans + t;
    }
    reverse(ans.begin(),ans.end());
    cout << ans << endl;
    return 0;
}

1172: 矩阵边界和(指针专题) 

题目描述

给定一个m行n列的二维矩阵,求其四周边元素和。1<=m、n<=100000,可能是1行100000列,也可能是10000行50列,但保证矩阵元素不多于500000。你可能不能预定义数组的大小了,你要学会使用动态内存分配哦。你可以动态申请m*n个内存单元,然后用一维数组来存储二维数组,二维数组元素a[i][j]对应一维数组a[i*n+j],i、j均从0开始。

输入

输入第一行是m和n,然后是一个m行n列的矩阵。

输出

输出一个整数,表示矩阵所有边界元素的和。

样例输入 Copy
3 4
1 2 3 4 
5 6 7 8 
9 5 4 6 
样例输出 Copy
47

源代码 

#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
    int m,n;
    scanf("%d %d\n",&m,&n);
    int *a;
    a = (int*)malloc(sizeof(int)*m*n);
    for(int i = 0;i < m*n;i ++ )
        scanf("%d",&a[i]);
    long long num = 0;
    for(int i = 0; i < n;i ++ )num += a[i];
    if(m > 1)for(int i = (m-1)*n; i < m*n; i++)num += a[i];
    for(int i = n; i < (m-1)*n; i++)
    {
        if(i % n == 0)num += a[i];
        else if(i % n == (n-1))num += a[i];
        else continue;
    }
    printf("%lld",num);
    return 0;
}

1173: 密码解密(指针专题) 

题目描述

有加密当然也有解密啦。那我们来解密吧。已知明文中只有数字和字母,且加密的规则如下:将每个字符的ascii码的值减去24作为每个字符加密过后的密文,例如'a'的ascii码的值为97,那么加密后就变成了73。"73"就是'a'的密文。所以,若密文是“757392”,则解密后的原文是“cat”。现在请你编写程序,将一段密文解密为原文。
请定义并使用如下函数
void decrypt(char *cipher, char *plain)
{
//将密文cipher解密后将明文存入plain
}

输入

输入一串字符串,最长为200。

输出

输出解密后的原文。

样例输入 Copy
987790872526
样例输出 Copy
zero12

源代码 

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    string s;
    getline(cin,s);
    string ans;
    for(int i = 0;i < s.size();i += 2)
    {
        int num = (s[i] - '0') * 10 + (s[i + 1] - '0') + 24;
        ans += char(num);
    }
    cout << ans << endl;
    return 0;
}

1174: 长整数排序(指针专题)

题目描述

长整数排序。输入n 然后输入n个位数不超过100位的大整数,输入的整数可能含有前导0。将这n个长整数排序后输出,输出不含前导0。
int greater(char *s1, char *s2)
{
若s1指向的整数大于s2指向的整数,返回一个正整数;
若s1指向的整数小于s2指向的整数,返回负整数;
若s1指向的整数等于s2指向的整数,返回0;
}

输入

输入第一行是一个正整数n(n<=10),接下来n行是n个大整数,均非负。

输出

输出n行,为n个升序排序后的大整数。

样例输入 Copy
3
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
54213456565
113456789456231545674632132156465132123156456423132156465461321654878976464654132132156455
样例输出 Copy
54213456565
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
113456789456231545674632132156465132123156456423132156465461321654878976464654132132156455

源代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> A;
int cmp(const string &a,const string &b)
{
    if(a.size() != b.size())return a.size() < b.size();
    for(int i = 0;i < a.size();i ++ )
    {
        if(a[i] != b[i])return a[i] < b[i];
    }
}
int main()
{
    int n;
    cin >> n;
    for(int i = 1;i <= n;i ++ )
    {
        string s;
        cin >> s;
        while(s.size() > 1 && s[0] == '0')s.erase(0,1);
        A.push_back(s);
    }
    sort(A.begin(),A.end(),cmp);
    for(int i = 0;i < A.size();i ++ )cout << A[i] << endl;
    return 0;
}

1175: 矩阵转置(指针专题) 

题目描述

给定一个m行n列的二维矩阵,输出其转置矩阵。1<=m、n<=100000,可能是1行100000列,也可能是10000行50列。你可能不能预定义数组的大小了,你要学会使用动态内存分配哦。

输入

输入第一行是m和n,然后是一个m行n列的矩阵。

输出

输出转置后的矩阵

样例输入 Copy
3 4
1 2 3 4 
5 6 7 8 
9 5 4 6 
样例输出 Copy
1 5 9
2 6 5
3 7 4
4 8 6

源代码 

#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
    int i,j,m,n,*a;
    scanf("%d%d",&m,&n);
    a=(int *)malloc(m*n*sizeof(int));
    for(i = 0;i < m * n;i ++ )
    scanf("%d",&a[i]);
    for(i = 0;i < n;i ++ )
    {
        for(j = 0;j < m;j ++ )
        {
            printf("%d ",*(a+j*n+i));
        }
        printf("\n");
    }
    free(a); 
    return 0;   
} 

1176: 查找最大字符串(指针专题) 

题目描述

从键盘上输入多个字符串(每个串不超过5个字符且没有空格),用”*****”作为串输入结束的标记。从所输入的若干字符串中,找出一个最大的串,并输出该串。要求最大串的查找通过调用编写的函数实现
void find(char *name[], int n, int *p)
{
//在包含n个字符串的二维字符数组name中,查找值最大的字符串,将其下标存入指针p所指内存单元
}

 

输入

一行输入一个字符串,输入多行

输出

输出一个字符串,单独占一行。

样例输入 Copy
zzzdf
fdsg
adff
rtrt
*****
样例输出 Copy
zzzdf

源代码 

#include <iostream>
#include <cstring>
#include <stdlib.h>
#define gets(S) fgets(S,sizeof(S),stdin)
using namespace std;
void find(char *name[], int n, int *p)
{
    char maxs[6];
    strcpy(maxs,name[0]);
    for(int i = 1;i < n;i ++ )
    {
        if(strcmp(maxs,name[i]) < 0)
        {
            strcpy(maxs,name[i]);
            *p=i;
        }
    }
}
int main(){
    char s[6];
    int n=0,i;
    char *str[100];
    for(i=0; ; i++)
    {
        gets(s);
        if(strcmp(s,"*****")==0)break;
        else
        {
            n++;
            str[i]=(char*)malloc(sizeof(char)*6);
            strcpy(str[i],s);   
        }
    }
    int a;
    find(str,n,&a);
    puts(str[a]);
    return 0;
}

1177: 按要求排序(指针专题) 

题目描述

输入n和n个整数,然后按要求排序,若输入1,请输出升序排序序列;若输入2,请输出降序排序序列,若输入3,请输出按绝对值升序排序序列。要求程序结构如下,请完善程序。

void sort(int a[], int n, int (*cmp)());
int CmpAsc(int x, int y); /*按升序要求判断两元素是否逆序*/
int CmpDec(int x, int y); /*按降序要求判断两元素是否逆序*/
int CmpAbsAsc(int x, int y);  /*按绝对值升序要求判断两元素是否逆序*/
int main(void)
{
   int a[10],i,n; 
   int slt;
 
 /*读入n和n个整数,存入数组a*/
  
   /*读入用户的选择,存入slt; */


    switch(slt)
   {
     case 1:   sort(a, n, CmpAsc); break;
     case 2:   sort(a, n, CmpDec); break;
     case 3:   sort(a, n, CmpAbsAsc);break;
   }

   /*输出排序后的数组*/


   }

void sort(int a[], int n, int (*cmp)())
{
 /*对数组a排序,排序原则由cmp指定,若cmp为真,表示两元素逆序*/

 }

int CmpAsc(int x, int y)
{
 //如果x>y返回1,否则返回0;
 
}

int CmpDec(int x, int y)
{
 //如果x<y返回1,否则返回0;
 }
 
int CmpAbsAsc(int x, int y)
{

//如果abs(x)>abs(y)返回1,否则返回0
}

输入

输入第一行是一个正整数n;

输入第二行是n个整数;

输入第三行是一个1~3的整数slt,表示用户的排序要求。

输出

输出n个整数。若用户的排序选择是1,则输出升序排序后的n个整数;若用户的排序选择是2,则输出降序排序后的n个整数;若用户的排序选择是3,则输出按绝对值升序排序后的n个整数;输出占一行,数据之间用空格隔开。

样例输入 Copy

5
2 -3 1 5 4
2

样例输出 Copy

5 4 2 1 -3

提示

请采用稳定的排序算法

源代码

#include <iostream>
using namespace std;
void sort(int a[], int n, int (*cmp)(int x,int y));
int CmpAsc(int x, int y); /*按升序要求判断两元素是否逆序*/
int CmpDec(int x, int y); /*按降序要求判断两元素是否逆序*/
int CmpAbsAsc(int x, int y);  /*按绝对值升序要求判断两元素是否逆序*/
int main(void)
{
    int a[10],i,n; 
    int slt;
    cin >> n;
    for(i = 0;i < n;i ++ )cin >> a[i];
    cin >> slt;
    switch(slt)
    {
        case 1:   sort(a,n,CmpAsc); break;
        case 2:   sort(a,n,CmpDec); break;
        case 3:   sort(a,n,CmpAbsAsc);break;
    }
    for(int i = 0;i < n;i ++ )cout << a[i] << ' ';
    return 0;
   }
void sort(int a[], int n, int (*cmp)(int x,int y))
{
    for(int i = 0;i < n - 1;i ++ )
    {
        for(int j = i + 1;j < n;j ++ )
        {
            if((*cmp)(a[i],a[j]))
            {
                int t;
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
    }
}
 
int CmpAsc(int x, int y)
{
    if(x > y)return 1;
    else return 0;
}
 
int CmpDec(int x, int y)
{
    if(x < y)return 1;
    else return 0;
 }
  
int CmpAbsAsc(int x, int y)
{
    if(abs(x) > abs(y))return 1;
    else if(abs(x) == abs(y) && x > y)return 1;
    else return 0;
}

1178: 单词数 

题目描述

统计一篇文章里不同单词的总数。

输入

有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由大小写字母和空格组成,没有标点符号,遇到#时表示输入结束。每篇文章的单词数小于1000,每个单词最多由30个字母组成。

输出

每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。

样例输入 Copy

you are my friend
#

样例输出 Copy

4

源代码 

#include <iostream>
#include <unordered_set>
using namespace std;
unordered_set<string> A;
int main()
{
    string s;
    while(getline(cin,s))
    {
        if(s == "#")break;
        int head = 0;
        for(int i = 0;i < s.size();i ++ )
        {
            if(s[i] != ' ')
            {
                head = i;
                break;
            }
        }
        if(s.size() != ' ')s = s + ' ';
        for(int i = head;i < s.size();i ++ )
        {
            int j = i + 1;
            while(s[j] != ' ' && j < s.size())j ++ ;
            string t;
            for(int k = i;k < j;k ++ )t += s[k];
            A.insert(t);
            while(s[j] == ' ' && j < s.size())j ++ ;
            i = j - 1;
        }
        cout << A.size() << endl;
        A.clear();
    }
    return 0;
}

1179: 带参宏定义(函数专题) 

题目描述

从键盘输入三个字符,用空格隔开,使用带参宏定义1中SWAP,将三个字符按从大到小的顺序排序输出。
宏定义1:#define SWAP(a, b, t) { t=a; a=b; b=t; }

请尝试,如果用宏定义2中的SWAP,主函数需要如何修改才能得到正确结果?
宏定义2:#define SWAP(a, b, t) t=a;a=b;b=t;

输入

输入三个字符,用空格隔开

输出

输出占一行,包含三个字符,用空格隔开

样例输入
w a q
样例输出
w q a

源代码 

#include <iostream>
using namespace std;
#define SWAP(a,b,t) {t = a;a = b;b = t;}
int main()
{
    char a,b,c,t;
    cin >> a >> b >> c;
    if(a < b)SWAP(a,b,t);
    if(a < c)SWAP(a,c,t);
    if(b < c)SWAP(b,c,t);
    cout << a << ' ' << b << ' ' << c <<endl;
    return 0;
}

1180: 成绩统计(结构体专题)

题目描述

从键盘输入若干个学生的信息,每个学生信息包括学号、姓名、3门课的成绩,计算每个学生的总分,输出总分最高的学生的信息。

输入

首先输入一个整数n(1<=n<=100),表示学生人数,然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及三个整数,表示语文、数学、英语三门课成绩,数据之间用空格隔开。

输出

输出总成绩最高的学生的学号、姓名、及三门课成绩,用空格隔开。若有多个最高分,只输出第一个。

样例输入 Copy
3
541207010188 Zhangling 89 78 95
541207010189 Wangli 85 87 99
541207010190 Fangfang 85 68 76
样例输出 Copy
541207010189 Wangli 85 87 99

源代码 

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000 + 10;
struct Student
{
    string num;
    string name;
    int a,b,c,sum;
};
Student stu[N];
int cmp(const struct Student &A,const struct Student &B)
{
    return A.sum > B.sum;
}
int main()
{
    int n;
    cin >> n;
    for(int i = 1;i <= n;i ++ )
    {
        cin >> stu[i].num >> stu[i].name >> stu[i].a >> stu[i].b >> stu[i].c;
        stu[i].sum = stu[i].a + stu[i].b + stu[i].c;
    }
    sort(stu + 1,stu + 1 + n,cmp);
    cout << stu[1].num << ' ' << stu[1].name << ' ' << stu[1].a << ' ' <<stu[1].b << ' ' << stu[1].c << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/couchpotatoshy/article/details/126253908