东华大学2020考研计算机复试准备上机题解析答案_基础篇(61-93)

前言:

快过年了,我马上也要回家了,可能要停一段时间
开更,开更了。
如果有格式错误的地方,请不吝赐教,我好修改一下,三克油!

如果有问题交流咨询,可以加入QQ群:673852347

61 稀疏矩阵

作者: 孙辞海 时间限制: 1S 章节: 二维数组

问题描述 :
今天明明学到了什么叫做矩阵,但他发现要将一个矩阵输入进电脑是一件很麻烦的事。特别是有些矩阵很大,且大部分元素都是0,我们称这类矩阵为稀疏矩阵。 于是,明明发明了一种简单的表示方法,只指出矩阵中非零元素来表示该矩阵。
例如一个矩阵:
0 0 0 5
2 0 0 0
0 1 0 0
0 0 4 0
可以表示成:
1 4 5
2 1 2
3 2 1
4 3 4
但明明又开始力不从心了,于是再一次想到了你…
明明的问题可以归结为:试编程将一个稀疏矩阵a转换成只存放非零元素的矩阵b,即找出每个不是0的元素,按从左到右从上到下的顺序,输出其所在的行和列以及它的值。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。
每组数据的第一行包括两个整数,M和N,用空格隔开,表示矩阵大小为M * N(1 ≤ M, N ≤ 20),之后的M行每行有N个整数,也用空格隔开,整数的大小不会超出int型,且必有一个数非零。行首行尾没有空格,每组测试数据之间也没有多余空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。对应每组输入数据,用明明的矩阵表示法输出该矩阵,即找出每个不是0的元素,按从左到右从上到下的顺序,输出其所在的行和列(行、列下标从1开始)以及它的值。其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。 注:通常,显示屏为标准输出设备。

#include<stdio.h>// summershell
int main()//基本概念,数据结构的三元组存储稀疏矩阵
{
    int n,m,t=1,temp;//So easy!
    while(scanf("%d %d",&m,&n)!=EOF)
    {
        if(t++!=1)printf("\n");
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&temp);
                if(temp)printf("%d %d %d\n",i,j,temp);
            }
    }
    return 0;
}

62 矩阵问题

作者: Turbo 时间限制: 1S 章节: 二维数组

问题描述 :

从键盘上输入一个整数N,按以下规律输出一个(2N+1)*(2N+1)的矩阵:
对角线的值为1,
上半三角区域值为2,
下半三角区域值为3,
左半三角区域的值为4,
右半三角区域的值为5。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组测试数据数据占一行,大于零,小于等于8。
输出说明 :
对每组测试数据,你的程序需要向标准输出文件(通常为启动该程序的终端)依次输出符合要求的矩阵,每行数据与数据之间以空格分隔,在行首和行尾不要输出多余的空格。在所有数据前后,以及两组数据之间不要输出多余的空行。

#include<stdio.h>// summershell
int main()
{
    int N;
    while(scanf("%d",&N)!=EOF)
    {//一遍成,OK提交去
        for(int i=1;i<=2*N+1;i++)
        {
            for(int j=1;j<=2*N+1;j++)
            {
                if(j!=1)printf(" ");
                if(i==j || i+j==2*N+2)printf("1");
                else if((i<=N+1)&&(j>i && j<2*N+2-i))printf("2");
                else if((i>N+1)&&(j<i && j>2*N+2-i))printf("3");
                else if(j<i)printf("4");
                else if(j>2*N+2-i)printf("5");
            }
            printf("\n");
        }
    }
    return 0;
}

63 倒序

作者: 孙辞海 时间限制: 1S 章节: 字符串

问题描述 :
编写程序,把一串字符以倒序的方式输出。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。第一行输入字符串的个数n。之后就有n组输入数据,每组输入为一行字符串,该串由ASCII字符的任意组合构成,它们之间可能有一个或多个空格,在行首和行尾没有多余的空格。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端,例如你在Windows中启动该程序所用的命令行终端)依次输出从标准输入设备中读入的每一组测试数据对应的结果,使其成为输入串的倒序。所有数据前后没有多余的空格,两组数据之间也没有多余的空行。

#include<stdio.h>// summershell
#include<string.h>
int main()
{
    int N;
    char s[100];
    scanf("%d%c",&N,&s[99]);//吃掉换行符
    while(N--)
    {
        gets(s);
        int len=strlen(s)-1;
        while(len>=0)
        {
            printf("%c",s[len]);
            len--;
        }
        printf("\n");
    }
    return 0;
}

64 统计字母

作者: 朱星垠 时间限制: 1S 章节: 字符串

问题描述 :
输入一串字符串,以’!‘结束,不分大小写,统计其中每种英文字符出现的次数。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成,其中只包括大小写的英文字母和’!‘,且以’!'结尾,每行字符数不超过100。两组数据之间没有多余的空行。在行首和行尾没有多余的空格。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案。每组测试数据由若干行组成,统计每组输入数据输出中出现字母的次数,按照字典序输出,每个出现字母及其出现次数占据一行。在行首和行尾没有多余的空格。具体格式见下。

#include<stdio.h>// summershell
#include<string.h>
int main()
{
    int len,alpha[27];
    char s[100];
    while(gets(s)!=NULL)
    {
        len=strlen(s)-1;//去掉最后的感叹号!
        memset(alpha,0,sizeof(alpha));
        for(int i=0;i<len;i++)
            if(s[i]>='a'&&s[i]<='z')alpha[s[i]-'a']++;
            else if(s[i]>='A'&&s[i]<='Z')alpha[s[i]-'A']++;
        for(int i=0;i<26;i++)
            if(alpha[i])printf("%c:%d\n",i+'A',alpha[i]);
    }
    return 0;
}

65 求小数位数个数

作者: 张志寿 时间限制: 10S 章节: 字符串

问题描述 :
明明最近在一家软件公司实习,公司分配给他一个任务,要他写一个小程序,这个程序的功能是求出一个浮点数的小数部分的长度。例如程序输入1.1,则输出1,程序输入1.11,则输出2,明明觉得这个非常简单,花了不到5分钟的时间就把程序给写出来了,然后就把程序交给了测试员测试。但是没有想到的是,经过测试员的测试,发现了一大堆的错误,返回的结果很多都是不对的,这个令明明相当的不解,始终想不通自己的程序错在哪里。你是一名经验丰富的程序员,明明把这个问题来求助于你,明明和你说了他的想法,你一听就明白明明错在了哪里,原来明明使用double型来存放浮点数,但是由于double型的精度问题,不可能把所有的小数都精确的保存好,如果小数位数很长,就会出错。你发现了问题。现在请你写出正确的程序。 明明的问题可以归结为:给你一个浮点数,请你求出这个浮点数的小数位数。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅包括一个浮点数数n,n的长度不超过100。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即n的小数部分的位数。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。

//当时写的有点多余了 可以找到小数点的位置后 拿总长度减去小数点的位置
#include<stdio.h>// summershell
#include<string.h>
int main()
{
    char s[101];
    while(gets(s)!=NULL)
    {
        int len=strlen(s)-1,cou=0,pos=0;
        while(s[pos]!='.')pos++;//找到小数点
        while(pos++<len)cou++;
        printf("%d\n",cou);
    }
    return 0;
}

66 加密

作者: 卢婷 时间限制: 2S 章节: 字符串

问题描述 :

编写一个加密程序,用来加密一个字符串。加密规则如下:

  1. 把字符串中的所有数字0、1 … 9分别换成小写英文字母a、b … j。
  2. 把字符串中的所有小写英文字母a、b … j分别换成数字0、1 … 9。
  3. 其它字符保持不变。

输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据占一行,其中只包含一个字符串,即需要被加密的字符串。该字符串包含不超过100个字符,只包含可见的ASCII字符,并且不包含空格、制表符或换行符。在行首和行尾没有多余的空格;所有数据前后没有多余的空行;两组数据之间没有多余的空行。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端,例如你在Windows中启动该程序所用的命令行终端)依次输出一组对应的答案。每组答案占一行,其中只包含一个字符串,即问题描述中的加密结果。在行首和行尾不要输出多余的空格;在所有数据前后不要输出多余的空行;在两组数据之间不要输出多余的空行。

#include<stdio.h>// summershell
#include<string.h>
int main()
{
    char s[101];
    while(gets(s)!=NULL)
    {
        int len=strlen(s),pos=0;
        while(pos<len)
        {
            if(s[pos]>='0' && s[pos]<='9')printf("%c",s[pos]-'0'+'a');
            else if(s[pos]>='a' && s[pos]<='j')printf("%c",s[pos]-'a'+'0');
            else putchar(s[pos]);
            ++pos;
        }
        printf("\n");
    }
    return 0;
}

67 求绝对值

作者: Hu Yongjian 时间限制: 1S 章节: 字符串

问题描述 :
给你一个大整数(绝对值不超过1,000位数),请求出这个数字的绝对值。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据占一行,其中仅有一个整数N;N的绝对值不会超过1,000位数;输入的数据没有前导零;如果N是负数,则在负号和最左边一位数字之间不会有空格。每行的行首和行尾都没有多余的空格。在所有数据的前后,以及两组数据之间都没有多余的空行。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案。每组答案占一行,其中仅有一个整数,即N的绝对值。在行首和行尾不要输出多余的空格。在所有数据的前后,以及两组数据之间不要输出多余的空行。

#include<stdio.h>// summershell
#include<string.h>
int main()
{
    char s[1001];
    while(gets(s)!=NULL)puts(s[0]=='-'?s+1:s);
    return 0;
}

68 请给我加密

作者: 朱星垠 时间限制: 1S 章节: 字符串

问题描述 :
编写一个加密程序,将一个英文句子加密后输出。加密译码规则为:
1.由键盘输入英文句子和密钥M(0≤M≤50);
2.将其中的英文字符都变为大写,用数字1…26 分别代表A…Z并加上密钥M后输出;
3.将其中的空格用数字‘0’输出;
4.其它符号则变成其ASCII序号加上100输出;
5.输出的数字之间用空格分隔。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。
第一行输入为输入数据的组数n。
每组输入包括两行,第一行为英文原句,可能包含一个或多个空格,第二行为密钥M(0≤M≤50),M为整数。
输出说明 :
对应每组输入你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组(一行)对应的答案:一行加密后的句子,中间以一个空格隔开,行首行尾无空格。两组之间无空行。

 
#include<stdio.h>// summershell
#include<string.h>
int main()
{
    char s[2020];
    int n,M,len;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%c",&s[2019]);//一定要吃掉换行符
        gets(s);
        scanf("%d",&M);
        len=strlen(s);
        for(int i=0;i<len;i++)
        {
            if(i!=0)printf(" ");
            if(s[i]>='a' && s[i]<='z')printf("%d",s[i]-'a'+1+M);
            else if(s[i]>='A' && s[i]<='Z')printf("%d",s[i]-'A'+1+M);
            else if(s[i]==' ')printf("0");
            else printf("%d",s[i]+100);
        }
        printf("\n");
    }
    return 0;
}

69 进制转换

作者: 朱星垠 时间限制: 1S 章节: 字符串

问题描述 :
输入一个十进制数,将其化成N进制数输出(2≤N≤16)。 输出结果时,大于等于10的数字用字母代替,A代表10,B代表11以此类推。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成,每行有2个数,分别代表十进制数m(0≤ m < 2^31)和进制N(2≤N≤16),它们以空格分隔,在行首和行尾没有多余的空格。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案:输出10进制数转换后的N进制数。所有数据前后没有多余的空格,两组数据之间也没有多余的空行。

#include<stdio.h>// summershell
int main()//今上午不是做了出了进制转换的题了吗?咋还有?
{
    int m,r;
    while(scanf("%d %d",&m,&r)!=EOF)
    {
        if(m==0){printf("0\n");continue;}
        int sta[100],top=-1;
        while(m)
        {//倒排取余法
            sta[++top]=m%r;
            m/=r;
        }
        while(top!=-1)
            if(sta[top]<10)printf("%d",sta[top--]);
            else printf("%c",'A'-10+sta[top--]);
        printf("\n");
    }
    return 0;
}

70 日期

作者: 卢婷 时间限制: 1S 章节: 字符串

问题描述 :
输入星期日到星期六的英文缩写(Sun,Mon,Tue,Wed,Thu,Fri,Sat),输出其对应的完整单词。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每行输入相关单词,在行首和行尾没有多余的空格。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端,例如你在Windows中启动该程序所用的命令行终端)依次输出从标准输入设备中读入的每一组测试数据对应的结果。所有数据前后没有多余的空行,两组数据之间也没有多余的空行。每组输出数据由一行组成,该行为该英文单词的全称。

#include<stdio.h>// summershell
#include<string.h>
int main()
{
    char s[2020];
    while(gets(s)!=NULL)
    {
        if(strcmp(s,"Sun")==0)puts("Sunday");
        if(strcmp(s,"Mon")==0)puts("Monday");
        if(strcmp(s,"Tue")==0)puts("Tuesday");
        if(strcmp(s,"Wed")==0)puts("Wednesday");
        if(strcmp(s,"Thu")==0)puts("Thursday");
        if(strcmp(s,"Fri")==0)puts("Friday");
        if(strcmp(s,"Sat")==0)puts("Saturday");
    }
    return 0;
}

71 单词统计

作者: 卢婷 时间限制: 1S 章节: 字符串

问题描述 :
输入一行字符,用函数编程统计其中有多少单词。
说明:以空格分隔开的任何字符串都认为是单词。比如“I’m”认为是一个单词
统计单词个数的函数原型为:int CountWords(char str[]);

输入说明 :
输入一行字符,最多能从键盘输入20个字符,单词之间以空格分开。
输出说明 :
输出一个单词个数(一个整数)。

#include<stdio.h>// summershell
#include<string.h>
int CountWords(char str[])//数空格不就好了,但是如果连续几个空格咋办?
{//遇见空格,且空格的前一位合法且不是空格,即为一个单词
    int len=strlen(str),coun=0;
    str[len]=' ';//不失去一般性
    len++;
    for(int i=0;i<len;i++)
        if(str[i]==' ' && i-1>=0 && str[i-1]!=' ')coun++;
    return coun;
}
int main()
{
    char s[2020];
    while(gets(s)!=NULL)
        printf("%d\n",CountWords(s));
    return 0;
}

72 删除字符

作者: 卢婷 时间限制: 1S 章节: 字符串

问题描述 :
从键盘输入一个字符串和一个字符,将输入字符从字符串中删除,输出新的字符串。如果字符串中没有此字符,则原样输出字符串。
输入说明 :
输入两行,第一行输入一个字符串,第二行输入一个字符。
字符串最多允许输入20个任意字符。
输出说明 :
输出删除字符后的字符串。

#include<stdio.h>// summershell
#include<string.h>
int main()
{
    char s[2020],c;
    int len;
    while(gets(s)!=NULL)
    {
        scanf("%c",&c);
        len=strlen(s);
        for(int i=0;i<len;i++)if(s[i]!=c)printf("%c",s[i]);
    }
    return 0;
}

73 手机短号

作者: xxx 时间限制: 1S 章节: 字符串

问题描述 :
大家都知道,手机号是一个11位长的数字串,同时,作为学生,还可以申请加入校园网,如果加入成功,你将另外拥有一个短号。假设所有的短号都是“6”+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。
现在,如果给你一个11位长的手机号码,你能找出对应的短号吗?

输入说明 :
输入数据的第一行是一个N(N <= 1000),表示有N个数据,接下来的N行每一行为一个11位的手机号码。

输出说明 :
输出应包括N行,每行包括一个对应的短号,输出应与输入的顺序一致。

#include<stdio.h>// summershell
int main()
{
    int N;
    char str[2020];
    scanf("%d",&N);
    while(N--)
    {
        scanf("%s",str);
        printf("6");
        for(int i=6;i<11;i++)printf("%c",str[i]);
        printf("\n");
    }
    return 0;
}

74 字符串统计

作者: xxx 时间限制: 1S 章节: 字符串

问题描述 :
对于给定的一个字符串,统计其中小写字母出现的次数。
输入说明 :
输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
输出说明 :
对于每个测试实例,输出该串中数值的个数,每个输出占一行。

#include<stdio.h>// summershell
#include<string.h>
int main()
{
    int N;
    char str[2020];
    scanf("%d%c",&N,&str[2019]);//用2019吃掉换行符
    while(N--)
    {
        gets(str);
        int len=strlen(str),cou=0;
        for(int i=0;i<len;i++)if(str[i]>='a' && str[i]<='z')cou++;
        printf("%d\n",cou);
    }
    return 0;
}

75 弟弟的作业

作者: xxx 时间限制: 1S 章节: 字符串

问题描述 :
你的弟弟刚做完了“100以内数的加减法”这部分的作业,请你帮他检查一下。每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a和b是作业中给出的,均为不超过100的非负整数;c是弟弟算出的答案,可能是不超过200的非负整数,也可能是单个字符"?",表示他不会算。
输入说明 :
输入文件包含不超过100行,以文件结束符结尾。每行包含一道题目,格式保证符合上述规定,且不包含任何空白字符。输入的所有整数均不含前导0。
输出说明 :
输出仅一行,包含一个非负整数,即弟弟答对的题目数量。

这个确实 处理起来麻烦了一些
#include<stdio.h>// summershell
#include<string.h>//小心啊"?"的ascll值为63
int main()
{//我的处理办法是如下:
    int a,b,ans=0;
    char str[2020],flag;
    while(scanf("%d%c%d%c%s",&a,&flag,&b,&str[2019],str)!=EOF)
    {
        if(str[0]=='?')continue;
        int len=strlen(str),c=0;
        for(int i=0;i<len;i++)c=c*10+str[i]-'0';
        if(flag=='+' && a+b==c)ans++;
        if(flag=='-' && a-b==c)ans++;
    }
    printf("%d\n",ans);
    return 0;
}

76 字符串排序

作者: ZhouMingLiang 时间限制: 1S 章节: 字符串

问题描述 :
明明刚刚开始学英文,对于26个英文字母的顺序总是记不住,每次默写英文字母的时候,顺序总是前后颠倒。明明的爸爸对此相当着急,想有没有很好的办法来帮助明明记住字母的顺序。一天,明明的爸爸突然想到了一个游戏,能够帮助明明记住英文字母。这个游戏如下,给明明一个任意长度的英文字串,其中只包含小写字母,然后让明明对字符串中的字母排序,然后再把排完序的字符串写出来,如果连续写对10次的话,明明的爸爸就会奖励他,带他出去吃KFC。 例如:有一个字符串为asdf,经过排序后的字符串就是adfs。 明明显然对这个游戏非常感兴趣(其实明明更感兴趣的是那顿KFC),接受了他爸爸的提议,玩起了这个游戏。但是明明的爸爸在出题目考明明的时候,自己却犯了难,用英文随便写出一个无序的英文字符串是很简单的,但是排序的话却要费一些功夫,而且还不能出错,否则就无法知道明明做的对不对了。于是明明的爸爸请你帮忙,帮他写一个排序程序,来输出排序后的字符串。
明明爸爸的问题可以归结为:输入一行字符串,全部由小写字母构成,对字符串按26个英文字母的先后顺序进行排序,然后输出。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行由一个字符串组成,字符串中只包含小写字母,字符串的长度不超过100个字符。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个排序后的字符串。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。

我的处理是统计各个字符的个数 当然也可以使用排序算法 都是可以的
#include<stdio.h>// summershell
#include<string.h>//水题!
int main()
{
    int alpha[27];
    char str[2020];
    while(gets(str)!=NULL)
    {
        int len=strlen(str);
        memset(alpha,0,sizeof(alpha));
        for(int i=0;i<len;i++)alpha[str[i]-'a']++;
        for(int i=0;i<27;i++)
            if(alpha[i])
            for(int j=0;j<alpha[i];j++)printf("%c",i+'a');
        printf("\n");
    }
    return 0;
}

77 回文问题

作者: 朱星垠 时间限制: 1S 章节: 字符串

问题描述 :
输入一串字符,其长度小于200,判断该串字符是否构成回文。 所谓回文是指从左到右和从右到左读一串字符的值是一样的,如:ABCBA。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行字符组成,它们之间没有空格,在行首和行尾没有多余的空格。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案:构成回文的输出Yes ,反之输出 No。所有数据前后没有多余的空格,两组数据之间也没有多余的空行。

#include<stdio.h>// summershell
#include<string.h>
int huiwen(char str[])
{
    int len=strlen(str);
    for(int i=0;i<=(len-1)/2;i++)if(str[i]!=str[len-1-i])return 0;
    return 1;
}
int main()//水题!写了几百次的回文了
{
    char str[2020];
    while(gets(str)!=NULL)
        printf("%s\n",huiwen(str)?"Yes":"No");
    return 0;
}

78 字符串中找整数

作者: zzp 时间限制: 1S 章节: 字符串

问题描述 :
对于一个字符串,编程找出其中的所有整数。例如,字符串“a12bc34d05”,其中有整数12、34、5。

输入说明 :
程序输入包括多行,每一行都是一串字符,字符串长度不超过500。字符串中的字符只有字母与数字。

输出说明 :
程序输出为多行,每行第一个数代表所对应的字符串中整数的总个数。紧跟其后的依次是每个整数,数和数之间有一个空格。行与行之间没有多余空行,行首行尾没有多余空格。

#include<stdio.h>// summershell
#include<string.h>//水题!
int main()
{
    char str[2020];
    int num[2020];
    while(gets(str)!=NULL)
    {
        int len=strlen(str),temp=0,cou=0;
        str[len++]='a';
        for(int i=0;i<len;i++)
        {//很硬核的判断啊,哈哈哈
            if(str[i]>='0' && str[i]<='9')temp=temp*10+str[i]-'0';
            if((str[i]>='0' && str[i]<='9')&&(str[i+1]<'0' || str[i+1]>'9'))
            {
                num[cou++]=temp;
                temp=0;
            }
        }
        printf("%d",cou);
        for(int i=0;i<cou;i++)printf(" %d",num[i]);
        printf("\n");
    }
    return 0;
}

79 子字符串排序

作者: zzp 时间限制: 1S 章节: 字符串

问题描述 :
编程对字符串中的子串按字典序输出。子串的形成方法为:从原始字符串开始,依次去掉开头字符形成新的子串。
例如,字符串"grain" 的子串如下所示(依次去掉g,r,a,i):
grain、rain、ain、in、n
按字典序排列为:
ain
grain
in
n
rain
输入说明 :
输入有多行,每行一个字符串,每个字符串的长度大于0小于等于10,字符串中不包含空格。

输出说明 :
对每个字符串,按字典序输出所有子串。
行首与行尾不包含多余空格,也不包含多余空行。

 
#include<stdio.h>// summershell
#include<string.h>//还是C语言的字符串比较,用字符串数组
#include<stdlib.h>//快排还是蛮香的
int cmp(const void *a,const void *b)
{
    return strcmp((char *)a,(char *)b)>0?1:-1;//必须有个大小之分,不然排序出错,第一次没有注意这个就WA了
}
int main()
{
    char s[202][202],st[100];
    while(gets(st)!=NULL)
    {
        int len=strlen(st);
        for(int i=0;i<len;i++)strcpy(s[i],st+i);//字符串赋值要用这个
        qsort(s,len,sizeof(s[0]),cmp);
        for(int i=0;i<len;i++)puts(s[i]);
    }
    return 0;
}

80 平均分

作者: 江宝钏 时间限制: 1S 章节: 结构体

问题描述 :
从键盘依次输入每个学生的学号、姓名、出生年月、3门课的成绩,计算并打印出每个学生的平均成绩。
要求使用结构体数组。

输入说明 :
第一行,整数n,表示一共有n个学生。
从第二行开始共n行,每行包含学号,姓名,出生年,出生月,数学,英语,C语言的成绩,用空格分隔,姓名不含空格。
输出说明 :
共n行,每行包含学号,姓名,出生年/月,数学,英语,C语言,平均成绩。
输出浮点数使用“%.0f”,出生年月用“/”分开,数据之间以一个空格分隔。

#include<stdio.h>// summershell
struct student
{
    int stuID,birYear,birMonth;
    char name[10];
    double math,english,Clanguage;
}stu[100];
int main()//输出呗
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    scanf("%d %s %d %d %lf %lf %lf",&stu[i].stuID,stu[i].name,&stu[i].birYear,&stu[i].birMonth,&stu[i].math,&stu[i].english,&stu[i].Clanguage);
    for(int i=0;i<n;i++)
        printf("%d %s %d/%d %.0f %.0f %.0f %.0f\n",stu[i].stuID,stu[i].name,stu[i].birYear,stu[i].birMonth,stu[i].math,stu[i].english,stu[i].Clanguage,(stu[i].math+stu[i].english+stu[i].Clanguage)/3);
    return 0;
}

81 统计候选人的票数

作者: 卢婷 时间限制: 1S 章节: 结构体

问题描述 :
设有3个候选人zhang、li、wang(候选人姓名不区分大小写),10个选民,选民每次输入一个得票的候选人的名字,若选民输错候选人姓名,则按废票处理。选民投票结束后,程序自动显示各候选人的得票结果和废票信息。要求用结构体数组candidate表示3个候选人的姓名和得票结果。
输入说明 :
输入十行,每行表示一个选民的投票,每行包含一个候选人姓名。若选民输错候选人姓名,则按废票处理。
输出说明 :
选民投票结束后,程序自动显示各候选人的得票结果和废票信息。

  1. 每行输出“姓名: 票数”, 如zang:10。
  2. 最后一行输出:“Wrong election:票数”。
感觉那个continue很有用 解决了废票的处理问题
#include<stdio.h>// summershell
#include<string.h>
int main()//水题
{
    char str[10][10];
    int a=0,b=0,c=0,d=0;
    for(int i=0;i<10;i++)
        scanf("%s",str[i]);
    for(int i=0;i<10;i++)
    {
        if(strcmp(str[i],"li")==0){a++;continue;}
        if(strcmp(str[i],"zhang")==0){b++;continue;}
        if(strcmp(str[i],"wang")==0){c++;continue;}
        d++;
    }
    printf("li:%d\n",a);
    printf("zhang:%d\n",b);
    printf("wang:%d\n",c);
    printf("Wrong election:%d\n",d);
    return 0;
}

82 密码分析

作者: Turbo 时间限制: 1S 章节: 结构体

问题描述 :
密码分析学中常常需要统计字符出现的频度。给定若干行短文,要求按字符出现的频度由高到低输出,当两个字符出现的频度相同时,按字符大小的顺序输出。
注意:只需要统计英文字母的频度,非英文字母一律忽略。

输入说明 :
输入由多组数据组成。每组数据由一行长度不超过100的字符串组成,不区分字母大小写,如A与a看作同一个字母。
输出说明 :
对每组输入数据都有若干行输出,每行有两个输出数据,第一个数据为某个大写字母,第二个数据为该字母出现的频度,两个数据之间有一个空格。输出顺序按字母出现的频度由高到低输出,当两个字母的频度相同时,按字母大小的顺序输出。两组输出之间有一行空行。

#include<stdio.h>// summershell
#include<string.h>
#include<stdlib.h>
struct zifu
{
    int f;
    char x;
}alpha[30];
int cmp(const void *a,const void *b)
{
    if((*(struct zifu *)b).f-(*(struct zifu *)a).f!=0)
    return (*(struct zifu *)b).f-(*(struct zifu *)a).f;
    else return (*(struct zifu *)a).x-(*(struct zifu *)b).x;
}
int main()
{
    char str[100];
    int cou=1;
    while(gets(str)!=NULL)
    {
        if(cou++!=1)printf("\n");
        for(int i=0;i<30;i++)
        {
            alpha[i].f=0;
            alpha[i].x=i+'A';
        }
        int len=strlen(str),cou=0;
        for(int i=0;i<len;i++)
        {
            if(str[i]>='a' && str[i]<='z')alpha[str[i]-'a'].f++;
            if(str[i]>='A' && str[i]<='Z')alpha[str[i]-'A'].f++;
        }
        qsort(alpha,26,sizeof(alpha[0]),cmp);
        for(int i=0;i<27;i++)if(alpha[i].f)printf("%c %d\n",alpha[i].x,alpha[i].f);
    }
    return 0;
}

83 学生信息

作者: 孙辞海 时间限制: 2S 章节: 结构体

问题描述 :
你的程序需要从标准输入设备(通常为键盘)中输入N(1≤N≤10)个学生的信息,每项信息包含该学生的编号、姓名、性别、年龄、成绩共五项,按成绩进行排序,然后按成绩从低到高输出,输入保证没有相同的成绩。
输入说明 :
首先输入一个N(1≤N≤10),代表有几条学生记录,接下来N行每行包含一条学生记录,按照编号、姓名、性别、年龄、成绩的顺序给出,数据项之间以空格分隔,除了这五项之间的4个空格外,无其他空格。所有数据前后没有多余的空行,两个学生的记录之间也没有多余的空行。
输出说明 :
你的程序需要对学生的成绩按升序排序后输出所有学生的信息,每行一个学生的信息,同一个学生的信息之间以一个空格分隔。所有数据前后没有多余的空行,在行首和行尾没有多余的空格。

#include<stdio.h>// summershell
#include<string.h>
#include<stdlib.h>//沿用上一题的模板继续干 
struct student
{
    int ID,year,score;
    char sex[8],name[10];
}stu[11];
int cmp(const void *a,const void *b)
{
    if((*(struct student *)a).score-(*(struct student *)b).score!=0)
    return (*(struct student *)a).score-(*(struct student *)b).score;
    else return 1;
}
int main()
{
    int N;
    scanf("%d",&N);
    for(int i=0;i<N;i++)
        scanf("%d %s %s %d %d",&stu[i].ID,stu[i].name,stu[i].sex,&stu[i].year,&stu[i].score);
    qsort(stu,N,sizeof(stu[0]),cmp);
    for(int i=0;i<N;i++)printf("%d %s %s %d %d\n",stu[i].ID,stu[i].name,stu[i].sex,stu[i].year,stu[i].score);
    return 0;
}
//终于写完了,我希望我能一遍AC,太累人了,马上十一点半了(上午的) (╥╯^╰╥)a

84 求级数的和

作者: Turbo 时间限制: 1S 章节: 循环

问题描述 :
计算以下级数的和:

直到最后一项的绝对值小于10-6(该项不包括在结果中)。
输入说明 :
输入一个实数,代表x。
输出说明 :
输出结果,保留六位小数。整个输出无多余空格。

#include<stdio.h>// summershell
#include<math.h>//e^(-x)级数展开,轻车熟路
int main()
{
    double sum=2.0,temp=-1.0,x;//不用算第一项啊
    int n=1;
    scanf("%lf",&x);
    while(fabs(temp)>=0.000001)
    {
        sum+=temp;
        temp=-temp*x*1.0/n;
        n++;
    }
    printf("%.6f\n",sum);
    return 0;
}

85 计算多项式的值

作者: Turbo 时间限制: 1S 章节: 循环

问题描述 :

计算并输出当x<0.97时下列多项式的值,直到最后一项的绝对值小于threshold(该项不包括在多项式的结果中)为止。

在这里插入图片描述
输入说明 :

可输入多组测试数据,每组一行,每组包括两个实数,第一个为x(0.2≤x <0.97),第二个为threshold(≥0.000001),中间以空格分隔。

输出说明 :

对于每组测试数据,输出一行,为计算出的结果,保留6位小数。输出的结果前后均无空格。两组运算结果之间为空行。

输入范例 :

0.2 0.000001
0.21 0.000001
输出范例 :

1.095445

1.100000

AC代码:
注意使用绝对值函数作为终止条件即可,应该是有一个例子的精度大于1了。所以我给了个特判,然后加和就行了

#include<stdio.h>// summershell
#include<math.h>//这不是(1+x)^0.5次方的展开吗?Easy!
int main()
{
    double threshold,x;
    int cou=1;
    while(scanf("%lf %lf",&x,&threshold)!=EOF)
    {//唉!做着做着开始伤感了。就想起了宇哥的话,这类题目我早已熟稔于心
        if(cou++!=1)printf("\n");
        if(threshold>1){printf("0.000000\n");continue;}
        int n=2;
        double sum=1.0,temp=0.5*x;
        while(fabs(temp)>=threshold)
        {
            sum+=temp;
            temp=temp*(0.5-n+1)*x*1.0/n;
            n++;
        }
        printf("%.6f\n",sum);
    }
    return 0;
}

86 母牛的数量

作者: xxx 时间限制: 1S 章节: 一维数组

问题描述 :
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?说明:假设在第n年及之前所有牛都不曾死亡。

输入说明 :
首先输入一个T,表示以下包含T行输入数据(测试实例),每行包括一个整数n(0<n<55),n的含义如题目中描述。

输出说明 :
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行,行首与行尾均无空格,最后无空行。

很显然 今年的新生牛等于已经成熟的牛=去年的成熟牛 + 三年前的小牛
今年的成熟牛=去年的成熟牛+三年前的小牛 所以 二者可以合并
#include<stdio.h>// summershell
#include<math.h>//emm当前牛数量是未成熟的牛加上成熟牛
int main()
{
    int old[60]={0,1,1,1,1},newb[60]={0,0,1,1,1},T,n;
    for(int i=5;i<58;i++)
    {
        newb[i]=old[i-1]+newb[i-3];
        old[i]=old[i-1]+newb[i-3];
    }
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        if(n<=2)printf("%d\n",n);
        else
        printf("%d\n",old[n]+newb[n]+newb[n-1]+newb[n-2]);
    }
    return 0;
}

87 发工资咯

作者: xxx 时间限制: 1S 章节: 一维数组

问题描述 :
作为需要养家糊口的人,最盼望的日子就是每月发工资的日子,呵呵
但是对于财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡最近就在考虑一个问题:如果每个员工的工资额都知道,最少需要准备多少张人民币,才能在给每位员工发工资的时候都不用员工找零呢?
这里假设员工的工资都是正整数,单位元,人民币一共有100元、50元、20元、10元、5元、2元和1元七种。

输入说明 :
首先输入一个T,表示包含T组测试数据,
每组测试数据的第一行是一个整数n(n<100),表示员工的人数,
第二行是n个员工的工资。

输出说明 :
对于每组测试数据输出一个整数x,表示至少需要准备的人民币张数。
每个输出占一行,行首与行尾无多余空格,前后也无多余空行。

贪心的策略 能给大票就给大票
#include<stdio.h>// summershell
int main()//emm水题
{
    int T,n,temp,mon[8];//100元、50元、20元、10元、5元、2元和1元七种。
    scanf("%d",&T);
    while(T--)
    {
        for(int i=0;i<8;i++)mon[i]=0;
        scanf("%d",&n);
        while(n--)
        {
            scanf("%d",&temp);
            if(temp/100){mon[0]+=temp/100;temp%=100;}
            if(temp/50){mon[1]+=temp/50;temp%=50;}
            if(temp/20){mon[2]+=temp/20;temp%=20;}
            if(temp/10){mon[3]+=temp/10;temp%=10;}
            if(temp/5){mon[4]+=temp/5;temp%=5;}
            if(temp/2){mon[5]+=temp/2;temp%=2;}
            mon[6]+=temp;
        }
        printf("%d\n",mon[0]+mon[1]+mon[2]+mon[3]+mon[4]+mon[5]+mon[6]);
    }
    return 0;
}

88 你要乘坐的飞碟在这里

作者: xxx 时间限制: 1S 章节: 字符串

问题描述 :
一个众所周知的事实,在每一颗慧星后面是一个不明飞行物UFO。 这些不明飞行物时常来收集来自在地球上忠诚的支持者。 不幸地,他们的空间在每次旅行只能带上一群支持者。 他们要做的是用一种聪明的方案选择哪个团体被慧星带走。他们为每个慧星起了一个名字,通过这些名字来决定一个团体是不是特定的慧星带走。
那个相配方案的细节在下面被给出, 你的工作要写一个程序来通过团体的名字和彗星的名字来决定他们是否匹配。
团体的名字和慧星的名字都以这种方式转换成一个数字:
首先将名字中的每一个字母转换成数字, A转换成1,B转换成2… Z转换成26。然后将一个名字中所有字母(转换得到的数字)相乘得到结果。
举例来说,彗星“ABC”对应的结果会是123=6,团体“USACO” 会是 21191315=17955 。
如果团体的数字 mod 47 等于慧星的数字 mod 47,那么他们是匹配的,这个团体将会被带走 !
写一个程序读入慧星的名字和团体的名字,如果匹配则输出GO否则输出STAY。
团体的名字和慧星的名字将会是没有空格或标点的一串大写字母(不超过6个字母)
输入说明 :
第 1 行: 彗星的名字(一个长度为1到6的字符串) 第 2 行: 团体的名字(一个长度为1到6的字符串)
名字中没有空格或标点,且仅包含大写字母。
输出说明 :
单独一行包含STAY 或 GO

 
#include<stdio.h>// summershell
#include<string.h>
int main()//emm水题
{
    int unity=1,star=1;
    char str[2020];
    gets(str);
    for(int i=0,len=strlen(str);i<len;i++)star*=(str[i]-'A'+1);
    gets(str);
    for(int i=0,len=strlen(str);i<len;i++)unity*=(str[i]-'A'+1);
    puts(unity%47==star%47?"GO":"STAY");
    return 0;
}

89 字符串压缩

作者: 阮文灵 时间限制: 1S 章节: 字符串

问题描述 :
通过键盘输入字母(A-Z、a-z)组成的字符串,字符串长度不超过1000。首先将所有字母统一成小写字母,然后将字符串中连续出现的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。

输入说明 :
你写的程序需要从标准输入设备(通常为键盘)中读入多组测试数据,每组测试数据仅占一行,每行仅包括字母(A-Z、a-z)组成的字符串。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :
将处理后的字符串输出,行首与行尾无空格,也不输出多余空行。

#include<stdio.h>// summershell
#include<string.h>
int main()//emm水题,首先将所有字母统一成小写字母
{
    char str[2020];
    while(gets(str)!=NULL)
    {
        for(int i=0,len=strlen(str);i<len;i++)if(str[i]>='A' && str[i]<='Z')str[i]=str[i]-'A'+'a';
        for(int i=0,len=strlen(str);i<len;i++)
        {
            if(i+1<len && str[i]==str[i+1])
            {
                int coun=0;
                for(int j=i;j<len;j++)if(str[j]==str[i])coun++;else break;
                printf("%d%c",coun,str[i]);
                i=i+coun-1;
            }
            else printf("%c",str[i]);
        }
        printf("\n");

    }
    return 0;
}

90 选票统计

作者: Turbo 时间限制: 1S 章节: 结构体

问题描述 :
学生会主席投票选举工作正在举行。本次投票将采用电脑统计选票的方式,当投票选举正式开始后,同学们将排队一 一走到电脑前,投上自己神圣的一票:在电脑前输入一个姓名,然后输入回车表示确认。
投票结束后显示得票最高的同学姓名,该同学将当选为新一届学生会主席。
请编程统计投票。

输入说明 :
输入包含多行,每行是一个由英文字母组成的字符串,表示一个姓名,首尾以及中间都不包含空格。
参加投票学生的人数不超过100人,每个学生姓名字符串的长度小于20。
由于学生投票时输入的姓名有大写有小写,你在统计时不区分大小写,即"Liming"和"liming"是同一个人。
输出说明 :
输出为一个字符串——当选为学生会主席的学生姓名以及他的票数,中间用一个空格分隔。
输入保证没有两个人并列票数最高。
输出的英文字母全部用小写。

#include<stdio.h>// summershell
#include<string.h>//输出的英文字母全部用小写
int main()//emm水题,你在统计时不区分大小写,即"Liming"和"liming"
{
    char str[2020][21],st[21];
    int coun=0,people[2020]={1},maxnum=0,maxlen=-10,i,len;
    while(gets(st)!=NULL)
    {
        for(i=0,len=strlen(st);i<len;i++)if(st[i]>='A' && st[i]<='Z')st[i]=st[i]-'A'+'a';
        for(i=0;i<coun;i++)
            if(strcmp(str[i],st)==0)
            {
                people[i]++;
                if(people[i]>maxlen){maxlen=people[i];maxnum=i;}
            }
        if(i>=coun)
        {
            strcpy(str[coun],st);
            people[coun++]=1;
        }
    }
    printf("%s %d\n",str[maxnum],people[maxnum]);

    return 0;
}

91 数星星

作者: Turbo 时间限制: 1S 章节: 结构体

问题描述 :
一天,小明坐在院子里数星星,爸爸就出了个难题给她:爸爸在天空指定了一个区域,让他数数这个区域里有多少颗星星,爸爸还为他标出了每个星星的坐标。但小明数着数着就看花了眼,并且也可能忘记某一颗星星是否已经数过,但他的原则是:宁愿多数一次,不可错过一个。如果小明把他数过的星星的坐标都告诉你,你能否帮他进行排重处理(如果两个星星的坐标位置相同,则视为一个星星),计算出星星的个数。

输入说明 :
首先输入一个整数n(n<=300),接下来的n对整数,每对表示小明数过的一个星星的位置(星星的坐标在-10000到10000之间)。
输出说明 :
输出星星的个数。

#include<stdio.h>// summershell
int main()//emm不难呀
{
    int pos[2020][2],n,x,y,cou=0,i;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d %d",&x,&y);
        for(i=0;i<cou;i++)if(pos[i][0]==x && pos[i][1]==y)break;
        if(i>=cou){pos[cou][0]=x;pos[cou][1]=y;++cou;}
    }
    printf("%d\n",cou);
    return 0;
}

92 按出生日期排序

作者: Turbo 时间限制: 1S 章节: 结构体

问题描述 :
小明希望将自己的通讯录按好友的生日顺序排序,这样查看起来方便多了,也避免错过好友的生日。
为了小明的美好愿望,你帮帮他吧。小明的好友信息包含姓名、出生日期。其中出生日期又包含年、月、日三部分信息。
输入n个好友的信息,按生日的月份和日期升序输出所有好友信息。

输入说明 :
首先输入一个整数n(1<=n<=10),表示好友人数,
然后输入n行,每行包含一个好友的信息:姓名(不超过10位),以及三个整数,分别表示出生日期的年月日。
各数据之间以空格分隔,姓名中不包含空格。
输出说明 :
按过生日的先后(月份和日期)输出所有好友的姓名和出生日期(没有两个好友同一天过生日),用空格隔开,出生日期的输出格式见输出样例。

 
#include<stdio.h>// summershell
#include<stdlib.h>
struct friends
{
    char name[20];
    int year,data;//转成数字
}fri[2020];
int cmp(const void *a,const void *b)
{
    return (*(struct friends*)a).data-(*(struct friends*)b).data;
}
int main()//emm不难呀
{
    int n,i,a,b;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%s %d %d %d",fri[i].name,&fri[i].year,&a,&b);
        fri[i].data=a*100+b;
    }
    qsort(fri,n,sizeof(fri[0]),cmp);
    for(i=0;i<n;i++)
    printf("%s %d-%02d-%02d\n",fri[i].name,fri[i].year,fri[i].data/100,fri[i].data%100);
    return 0;
}

93 考试排名

作者: Turbo 时间限制: 1S 章节: 结构体

问题描述 :
C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点。它的功能是怎么实现的呢?
我们做好了题目的解答,提交之后,要么“AC”,要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题“AC”后,就要与你算一算帐了,总共该题错误提交了几回。虽然你在题数上,大步地跃上了一个台阶,但是在耗时上要摊上你共花去的时间。特别是,曾经有过的错误提交,每次都要摊上一定的单位时间分。这样一来,你在做出的题数上,可能领先别人很多,但是,在做出同样题数的人群中,你可能会在耗时上处于排名的劣势。
例如:某次考试一共8题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数,但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上一对括号,里面有个整数b,那就表示该学生提交该题AC了,耗去了时间a,同时,曾经错误提交了b次(如果b为0则没有括号及b),因此对于下述输入数据:

若每次错误提交的罚分为20分,即每错误提交一次,在总耗时时增加20分钟,则其排名从高到低应该是这样的:
Josephus 5 376
John 4 284
Alice 4 352
Smith 3 167
Bob 2 325
Bush 0 0
输入说明 :
输入数据的第一行是考试题数n(1≤n≤12)以及单位罚分数m(10≤m≤20),每行数据描述一个学生的用户名(不多于10个字符的字串)以及对所有n道题的答题现状,其描述采用问题描述中的数量标记的格式,见上面的表格,提交次数总是小于100,AC所耗时间总是小于1000。
学生数小于100。
输出说明 :
将这些学生的考试现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽,左对齐),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。除上面所描述的为了对齐输出的空格外,名字、题数和时间分相互之间有一个空格。

感觉我的这个题解 有点麻烦了
#include<stdio.h>// summershell
#include<string.h>
#include<stdlib.h>//终于啊,来到了最后一题,冲鸭!
struct student
{
    char name[20];
    int AC,time;//转成数字
}stu[2020];
int cmp(const void *a,const void *b)
{
    struct student x=*(struct student*)a;
    struct student y=*(struct student*)b;
    if(x.AC!=y.AC)return y.AC-x.AC;
    else if(x.time!=y.time)return x.time-y.time;
    else return strcmp(x.name,y.name);
}
int conver(char st[],int m)
{
    int sum=0,cuo=0,len=strlen(st),i;
    for(i=0;i<len;i++)
    {
        if(st[i]>'9' || st[i]<'0')break;
        sum=sum*10+st[i]-'0';
    }
    if(i>=len)return sum;
    i++;
    while(i<len-1)
    {
        cuo=cuo*10+st[i]-'0';
        i++;
    }
    return sum+cuo*m;
}
int main()//emm不难呀
{
    int n,m,cou=0;//,nn=6;
    char st[2020],c;
    scanf("%d %d",&n,&m);
    while(scanf("%s%c",stu[cou].name,&c)!=EOF)
    {
        stu[cou].AC=stu[cou].time=0;
        for(int i=0;i<n;i++)
        {
            scanf("%s",st);
            if(st[0]!='0' && st[0]!='-')//做对了才执行罚时,别搞错了
            {
                stu[cou].time+=conver(st,m);
              //  printf("%d===%d===\n",stu[cou].time,stu[cou].AC);
                stu[cou].AC++;
            }
        }
        cou++;
    }

    qsort(stu,cou,sizeof(stu[0]),cmp);
    for(int i=0;i<cou;i++)
    printf("%-10s %2d %4d\n",stu[i].name,stu[i].AC,stu[i].time);
    return 0;
}
//终于写完了,好累啊!好复杂这个题,希望一遍AC。希望我可以顺利成为东华大学2020级计算机科学与技术的研究生
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值