SDUTOJ 程序设计基础(C语言) 实验 7 8 9 难度较大题目记录

下周四又要机测了,周六期末考试......先复习着,555,QAQ

全字母句

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

全字母句 (pangram) 指包含字母表中全部 26 种英文字母(不区分大小写)的句子,其常被用于展示英文字体的显示效果。

现在,bLue 得到了很多句子,他想知道哪些句子是全字母句。

Input

输入数据有多组(数据组数不超过 100),到 EOF 结束。

每组数据包含一行长度不超过 100 的字符串。

Output

对于每组数据,输出一行。

如果是全字母句则输出 "Yes",否则输出 "No"(不包括引号)。

Sample Input

The quick brown fox jumps over the lazy dog.
The 6th ACM Funny Programming For/While Contest

Sample Output

Yes
No

Reference Code

#include<stdio.h>
int main()
{
    char s[100];
    int i;
    while (gets(s)!=NULL)
    {
        int count[91]={0},sum=0;
        for (i=0;s[i]!='\0';i++)
        {
            if (s[i]>='a'&&s[i]<='z') s[i]-=32;
            if (s[i]>='A'&&s[i]<='Z') count[s[i]]=1;
        }
        for (i=0;i<=91;i++)
        {
            sum+=count[i];
        }
        if (sum==26) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

字符统计2

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

输入英文句子,输出该句子中除了空格外出现次数最多的字符及其出现的次数。

Input

输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行。

Output

逐行输出每个句子中出现次数最多的字符及其出现的次数(如果有多个字符的次数相同,只输出ASCII码最小的字符)。

Sample Input

I am a student
a good programming problem
ABCD abcd ABCD abcd

Sample Output

a 2
o 4
A 2

Reference Code

#include<stdio.h>
#include<string.h>
int main()
{
    char str[101];
    while (gets(str)!=NULL)
    {
        int i,len=strlen(str),count[123]={0},max;
        for (i=0;i<len;i++)
        {
            if (str[i]==' ') continue;
            count[str[i]]++;
        }
        max=65;
        for (i=66;i<123;i++)
        {
            if (count[max]<count[i])
            {
                max=i;
            }
        }
        printf("%c %d\n",max,count[max]);
    }
    return 0;
}

回文串判定

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

输入一串字符(长度小于100),判断该串字符是否是回文串(正序读与逆序读内容相同)。

Input

输入一串字符(长度小于100)。

Output

若该串字符是回文串输出“yes",否则输出”no“。

Sample Input

asdfgfdsa

Sample Output

yes

Reference Code

//使用指针
#include<stdio.h>
#include<string.h>
int a(char *str)
{
    int len;
    len=strlen(str);
    char *p=str,*q=str+len-1;
    while (p<q)
    {
        if (*p==*q)
        {
            p++;
            q--;
        }
        else return 0;
    }
    return 1;

}
int main()
{
    char str[100];
    gets(str);
    if (a(str)) printf("yes");
    else printf("no");
    return 0;
}
//一般做法
#include<stdio.h>
#include<string.h>
int main()
{
    char a[101],b[101];
    int i,j,len;
    gets(a);
    len=strlen(a);
    for(i=len-1,j=0;i>=0;i--)
    {
        b[j++]=a[i];
    }
    b[j]='\0';
    if(strcmp(a,b)==0) printf("yes\n");
    else printf("no\n");
    return 0;
}

C语言实验——保留整数

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

输入一个字符串str1,把其中的连续非数字的字符子串换成一个‘*’,存入字符数组str2 中,所有数字字符也必须依次存入 str2 中。输出str2。

Input

输入为一行字符串str1,其中可能包含空格。字符串长度不超过80个字符。

Output

输出处理好的字符串str2。

Sample Input

$Ts!47&*s456  a23* +B9k

Sample Output

*47*456*23*9*

Reference Code

#include<stdio.h>
#include<string.h>
int main()
{
    char str1[81],str2[81];
    gets(str1);
    int i,j,len=strlen(str1),flag=0;
    for (i=0,j=0;i<len;i++)
    {
        if ((str1[i]<'0'||str1[i]>'9')&&flag==0)
        {
            str2[j]='*';
            flag=1;
            j++;
        }
        else if (str1[i]>='0'&&str1[i]<='9')
        {
            str2[j]=str1[i];
            flag=0;
            j++;
        }
    }
    str2[j]='\0';
    puts(str2);
    return 0;
}

C语言实验——单词统计

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

从键盘输入一行字符(长度小于100),统计其中单词的个数,各单词以空格分隔,且空格数可以是多个。

Input

输入只有一行句子。仅有空格和英文字母构成。

Output

单词的个数。

Sample Input

stable marriage  problem Consists     of Matching members

Sample Output

7

Reference Code

#include<stdio.h>
#include<string.h>
int main()
{
    char str[101];
    gets(str);
    int i,len=strlen(str),word=0,count=0;
    for (i=0;i<len;i++)
    {
        if (str[i]==' ')
        {
            word=0;
        }
        else if (word==0)
        {
            word=1;
            count++;
        }
    }
    printf("%d",count);
    return 0;
}

小鑫の日常系列故事(七)——小纸条

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

小鑫在高中的时候喜欢上了一个十分漂亮的女孩。那个女孩也很喜欢他,就答应成为他的女朋友。

但是大家都知道高中的生活是忙碌的,除了上课就是上课,有时候可能连课间时间都被老师占用。于是小鑫想出了在上课给女朋友传纸条的方法来表达自己的爱慕。

又但是她与小鑫之间的距离太远,中间必须通过同学来传递纸条。可他们并不想让同学们知道写的什么就想到加密纸条这种方法。方法如下:

他们每天都会约定加密常数n,举个例子,当n=1时,今天写的每一句话中所用的字母都会向后+1,比如:i love you就成了j mpwf zpv ,当然了当是z的时候,+1就等于a。

请你帮他女朋友解密他写的纸条么?

Input

输入为多组,每组为两行。

第一行为n,-50<n<50

第二行为一句话,只有小写字母和空格。长度小于10000

Output

输出解密之后的内容

Sample Input

1
j mpwf zpv

Sample Output

i love you

Reference Code

#include<stdio.h>
#include<string.h>
int main()
{
    int n,i,j,k,m;
    char s[10000];
    while (scanf("%d",&n)!=EOF)
    {
        getchar();
        gets(s);
        k=n%26;
        for(i=0;s[i]!='\0';i++)
        {
            if(s[i]==' ')
                continue;
            else
            {
                m=s[i]-k;
                if(m<'a')
                    s[i]=m+26;
                else if(m>'z')
                    s[i]=m-26;
                else s[i]=m;
            }
        }
        puts(s);
    }
    return 0;
}

X的旅游计划

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

X在最后的几周安心学习,考试有惊无险,so,X和女友就要计划一下放假后的时间了,来一场说走就走的旅行,这是两个人的一致想法,但是究竟去哪里玩,就要好好考虑一下了。

X和他的女友都有一些自己想去的地方,于是X想让大家帮他找一找两个人都想去的地方。

Input

测试案例有多组,每个案例:

第一行输入两个数n,m(n < 100 && m < 100)。X想要去的地方有n个,女友想要去的地方有m个。

之后n行,每行一个字符串(长度小于10)表示X想去的地名。

之后m行,每行一个字符串(长度小于10)表示女友想去的地名。

Output

将在n中和在m中都出现过得字符串输出(字典序)。

如果没有相同的字符串,输出”sad!”(不含引号)。

Sample Input

2 2
aaa
bbb
aaa
bbb

Sample Output

aaa
bbb

Reference Code

#include<stdio.h>
#include<string.h>
int main()
{
    int n,m,i,j,k,flag;
    char a[101][11],b[101][11],c[101][11];
    while (scanf("%d %d",&n,&m)!=EOF)
    {
        for (i=0;i<n;i++)
        {
            scanf("%s",a[i]);
        }
        for (i=0;i<m;i++)
        {
            scanf("%s",b[i]);
        }
        for (i=0,k=0,flag=0;i<n;i++)
        {
            for (j=0;j<m;j++)
            {
                if (strcmp(a[i],b[j])==0)
                {
                    strcpy(c[k++],a[i]);//a[i]或b[j]均可
                    flag=1;
                }
            }
        }
        if (flag==1)
        {
            char temp[101];
            for (i=0;i<(k-1);i++)
            {
                for (j=i+1;j<k;j++)
                {
                    if (strcmp(c[i],c[j])>0)
                    {
                        strcpy(temp,c[i]);
                        strcpy(c[i],c[j]);
                        strcpy(c[j],temp);
                    }
                }
            }
            for (i=0;i<k;i++)
            {
                printf("%s\n",c[i]);
            }
        }
        else printf("sad!\n");
    }
    return 0;
}

编码

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

给你一个由大写字母组成的组成的字符串,你可以用如下规则对其进行编码:

1、 包含K个相同字母的连续字符串可以用KX表示,其中X是相同的字母。

2、 如果K为1,不输出K

Input

输入有多组,直到文件结束。每组一个字符串,长度为10000以内

Output

输出编码后的字符串。

Sample Input

ABC
ABBCCC

Sample Output

ABC
A2B3C

Reference Code

#include<stdio.h>
#include<string.h>
int main()
{
    char str[10001],str1[10001];
    int i,len,count,flag;
    while (gets(str)!=NULL)
    {
        count=1;
        flag=0;
        len=strlen(str);
        for (i=0;i<len;i++)
        {
            if (str[i]==str[i+1])
            {
                count++;
                flag=1;
            }
            else if (flag==0)
            {
                printf("%c",str[i]);
            }
            else
            {
                printf("%d%c",count,str[i]);
                count=1;
                flag=0;
            }
        }
        printf("\n");
    }
    return 0;
}

爬山

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

LeiQ最近参加了一个登山俱乐部,部长给他了一个n*m地图,地图上的每一个格子的值表示一个山的海拔高度,LeiQ现在在(x,y)表示在地图上的位置,他想要登上地图上最高的山,所以他想知道他爬上最高的山的山顶还需向上爬多少米。

例如:

xy123
1100130150
2200300100
310015050

现在LeiQ在(2,1),则他的位置海拔高度为200米,最高的为300米,所以还需爬100米

Input

多组输入
每组的第一行是两个整数n,m(1<=n,m<=100),表示地图的大小

接下来n行,每行m个整数,表示山的海拔高度(0<=Hij<=1000)

最后一行两个整数x,y表示LeiQ的位置

Output

输出他还需要向上爬多少米。

Sample Input

3 3
100 130 150
200 300 100
100 150 50
2 1

Sample Output

100

Reference Code

#include<stdio.h>
int main()
{
    int m,n,a[100][100],i,j,k,x,y,max,temp,t;
    while (scanf("%d %d",&n,&m)!=EOF)
    {
        for (i=0;i<n;i++)
        {
            for (j=0;j<m;j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        scanf("%d %d",&x,&y);
        t=a[x-1][y-1];
        for (k=0;k<n;k++)
        {
            for (i=0;i<m-1;i++)
            {
                for (j=0;j<m-i-1;j++)
                {
                    if (a[k][j+1]>a[k][j])
                    {
                        temp=a[k][j+1];
                        a[k][j+1]=a[k][j];
                        a[k][j]=temp;
                    }
                }
            }
        }
        max=a[0][0];
        for (i=1;i<n;i++)
        {
            if (a[i][0]>max)
            {
                max=a[i][0];
            }
        }
        printf("%d\n",max-t);
    }
    return 0;
}

鞍点计算

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

找出具有m行n列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10。同一行和同一列没有相同的数。

Input

输入数据有多行,第一行有两个数m和n,下面有m行,每行有n个数。

Output

按下列格式输出鞍点:

Arrayi=x

其中,x代表鞍点,i和j为鞍点所在的数组行和列下标,我们规定数组下标从0开始。

一个二维数组并不一定存在鞍点,此时请输出None。

我们保证不会出现两个鞍点的情况,比如:

3 3
1 2 3
1 2 3
3 6 8

Sample Input

3 3
1 2 3
4 5 6
7 8 9

Sample Output

Array[0][2]=3

Reference Code

//方法一
#include<stdio.h>
int main()
{
    int x[10][10],m,n,i,j,k,min[10],max[10],flag;
    while (scanf("%d %d",&m,&n)!=EOF)
    {
        flag=0;
        for (i=0;i<m;i++)
        {
            for (j=0;j<n;j++)
            {
                scanf("%d",&x[i][j]);
            }
        }
        for (k=0;k<m;k++)
        {
            max[k]=x[k][0];
            for (i=1;i<n;i++)
            {
                if (x[k][i]>max[k]) max[k]=x[k][i];
            }
        }
        for (k=0;k<n;k++)
        {
            min[k]=x[0][k];
            for (i=1;i<m;i++)
            {
                if (x[i][k]<min[k]) min[k]=x[i][k];
            }
        }
        for (i=0;i<m;i++)
        {
            for (j=0;j<n;j++)
            {
                if (x[i][j]==max[i]&&x[i][j]==min[j])
                    printf("Array[%d][%d]=%d\n",i,j,x[i][j]);
                else flag++;
            }
        }
        if (flag==m*n) printf("None\n");
    }
    return 0;
}
//方法二
#include<stdio.h>
int main()
{
    int n,m,i,j,k,l,max;
    int x[10][10];
    scanf("%d %d",&m,&n);
    for (i=0;i<m;i++)
    {
        for (j=0;j<n;j++)
        {
            scanf("%d",&x[i][j]);
        }
    }
    for (i=0;i<m;i++)
    {
        max=x[i][0];
        for (j=0;j<n;j++)
        {
            if (max<x[i][j])
            {
                max=x[i][j];
                k=i;
                l=j;
            }
        }
        for (j=0;j<m;j++)
        {
            if (x[j][l]<max) break;
        }
        if (j==m)
        {
            printf("Array[%d][%d]=%d\n",k,l,x[k][l]);
            break;
        }
    }
    if (i==m) printf("None\n");
    return 0;
}
Tags:none
上一篇
下一篇

添加新评论

captcha
请输入验证码