PTA - C语言国庆题集2

7-21 打妖怪

话说孙大圣保唐僧西天取经,路上遇到一妖怪。妖怪共有 v 滴血,大圣每打一棒就能使妖怪失去 h 滴血,妖怪的血小于10滴,就会立即死去。大圣打了 n 棒将妖怪打死。

请编写程序,输入v 和 h,输出n。假设 v 远远大于 10

输入格式:
v 和 h

输出格式:
n

注:题目保证 v、h 和 n 的值都在 int 类型的表示范围内。

输入样例:
在这里给出一组输入。例如:

2510 1000
输出样例:
在这里给出相应的输出。例如:

3

#include <stdio.h>
#include <math.h>

int main(){
    int v,h;scanf("%d %d",&v,&h);

    double ans;
    if(v%h<10){
        ans=v*1.0/h;
    }else{
        ans=ceil(v*1.0/h);
    }

    printf("%.0f",ans);
    return 0;
}

7-22 统计连续高温的最大天数

温度大于等于40度,即认为是高温天气。

输入格式:
第一行是一个n,表示待输入的天数,1<=n<=100000。

第二行开始有n个温度(假定温度都为正整数),中间用空格隔开。

输出格式:
输出连续高温的最大天数。(如果没有一天是高温,则输出0)

输入样例:
在这里给出一组输入。例如:

10
35 40 42 39 40 42 41 43 37 43
输出样例:
在这里给出相应的输出。例如:

4

#include <stdio.h>

int a[100009];
int main()
{
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    int ans=0;
    int cnt=0;
    for(int i=0;i<n;i++){
        int cnt=0;
        while(a[i]>=40) {
            cnt++;
            i++;
        }
        if(cnt>ans) ans=cnt;
    }
    printf("%d",ans);
    return 0;
}

7-23 唱歌比赛打分

学校进行歌唱比赛。每位选手演唱完毕后,由十位评委打分(分数为整数,满分100分)。

评分规则是,去掉一个最高分,去掉一个最低分,计算其他八位评委的平均分。

输入格式:
在一行中,输入十位评委给出的分数,空格隔开。

输出格式:
去掉一个最高分,去掉一个最低分,计算其他八位评委的平均分。结果保留一位小数。

输入样例:
在这里给出一组输入。例如:

100 73 78 95 86 93 88 87 89 72
输出样例:
在这里给出相应的输出。例如:

86.1

#include <stdio.h>
#include <stdlib.h>

int cmp(const void* e1,const void* e2){
    return *(int*)e1 - *(int*)e2;
}
int a[10];
int main()
{
    for(int i=0;i<10;i++) scanf("%d",&a[i]);
    qsort(a,10,sizeof(int),cmp);

    // for(int i=0;i<10;i++) printf("%d ",a[i]);
    int sum=0;
    double ans;
    for(int i=1;i<9;i++){
        sum+=a[i];
    }
    ans=sum*1.0/8;
    printf("%.1f\n",ans);
    return 0;
}

7-24 找最长的字符串

本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。

输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。

输出格式:
在一行中用以下格式输出最长的字符串:

The longest is: 最长的字符串
如果字符串的长度相同,则输出先输入的字符串。

输入样例:
5
li
wang
zhang
jin
xiang
输出样例:
The longest is: zhang

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Str{
    char ch[109];
    int len;
};
int cmp(const void* e1,const void* e2){
    return ((struct Str*)e2)->len - ((struct Str*)e1)->len;
}
int main(){
    struct Str S[1009];
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++) {
        scanf("%s",S[i].ch);
        S[i].len=strlen(S[i].ch);
    }
    qsort(S,n,sizeof(struct Str),cmp);

    printf("The longest is: %s",S[0].ch);
    return 0;
}

7-25 算龙脉

在中国古代,群龙聚会是常有的事,一个龙群的实力,往往由这个龙群的龙脉的强弱决定,但一群龙的龙脉的计算却是十分困难而且保密的工作,原因是,在龙群中,每条龙的实力,往往由一系列数字表示,如在有n条龙的龙群中,每条龙的实力,就有n个数,这样就构成了一个n*n的矩阵,所谓龙群的实力,就是这个矩阵上两个对角线上所有数值之和,现在要求,从键盘上输入一个数n,然后再输入n行数据,每行数据有n个整数,请您编写程序,输出该龙脉的值。

输入样例:
在这里给出一组输入。例如:

4
1 2 3 1
1 1 2 3
1 2 3 5
2 3 4 5
输出样例:
在这里给出相应的输出。例如:

17

#include <stdio.h>

int a[109][109];
int main()
{
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++)scanf("%d",&a[i][j]);
    }
    int sum=0;
    // if(n%2!=0){
    //     sum-=a[(n-1)/2][(n-1)/2];
    // }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++) 
        {
            if(i==j || i+j==n-1) sum+=a[i][j];
        }
    }
    printf("%d",sum);
}

7-26 DNA鉴定

DNA鉴定,在医学上主要是比较两个样本的基因序列的相似程度,但在我们计算机中,对字符串的处理,也可以参考DNA鉴定的方式,比较两个字符串的相似值。如果两个字符串相似程度越高,我们就认为这两个字符串就越相似,具体比较思路如下:给定两个字符串A,B,通过算法判断这两个字符串中相同字符的个数是多少。例:face 和areas 这两个字符串的相似度就是2
例:从屏幕上输入两行,每一行代表一个字符串(中间没有空格,全是英文字母,不区分大小写)。

输入样例:
在这里给出一组输入。例如:

face
areas
输出样例:
在这里给出相应的输出。例如:

2

#include <stdio.h>
#include <string.h>

int cmp(const void* e1,const void* e2){
    return *(char*)e1 - *(char*)e2;
}
int main(){
    char str1[109];
    char str2[109];
    gets(str1);
    gets(str2);
    // printf("%s\n",str1);
    // printf("%s",str2);
    // 先对str1去重 -> str3
    char str3[109];
    int index=0;
    qsort(str1,strlen(str1),sizeof(char),cmp);
    for(int i=0;str1[i]!='\0';i++){
        if(str1[i]!=str1[i+1]) str3[index++]=str1[i];
    }

    // printf(str3);
    int ans=0;
    for(int i=0;str3[i]!='\0';i++){
        for(int j=0;str2[j]!='\0';j++) {
            if(str3[i]==str2[j]) {
                ans++;
                break;
            }
        }
    }
    printf("%d",ans);
    return 0;
}

7-28 T9键盘

在iPhone和Android大行其道之后,几乎所有的智能手机都配上了大屏幕,用手指直接戳屏幕来输入文字。在这之前,需要通过键盘来输入文字的手机上,T9键盘是不折不扣的王者。
过去风靡全球的T9键盘外观的通常外观如下图:
请添加图片描述
如果人们需要键入”GALAXY”,那他们需要以如下顺序敲击键盘:4-2-5-2-9-9;在单手操作键盘是输入这个字串最少所需要移动手指的次数就是4次(一开始将手指放在4上不计入移动次数中)
现在给你一个仅包含大写字母的字符串,请你计算单手操作T9键盘键入该字符串最少所需要移动手指的次数。
输入格式:
输入第一行一个整数T(T<=50)代表输入数据组数
每组数据一行,一个字符串s表示待输入的字符串,该字符串由大写字母组成,且长度不超过50。

输出格式:
每组输出一行;首先输出Case #C:(C代表数据编号,从1开始直至T);紧跟一个空格符后输出键入该字符串最少所需要移动手指的次数。

输入样例:
在这里给出一组输入。例如:

3
GALAXY
ABC
ADGJM
输出样例:
在这里给出相应的输出。例如:

Case #1: 4
Case #2: 0
Case #3: 4

#include <stdio.h>

int main(){
    int t;scanf("%d",&t);
    int time=0;
    while(t--){
        char str[59];
        scanf("%s",str);
        getchar();
        int count=0;
        for(int i=0;str[i]!='\0';i++){
            if((str[i]=='A' ||str[i]=='B' || str[i]=='C') &&
               (str[i+1]=='A' ||str[i+1]=='B' || str[i+1]=='C')) continue;
            else if((str[i]=='D' ||str[i]=='E' || str[i]=='F') &&
               (str[i+1]=='D' ||str[i+1]=='E' || str[i+1]=='F')) continue;
            else if((str[i]=='G' ||str[i]=='H' || str[i]=='I') &&
               (str[i+1]=='G' ||str[i+1]=='H' || str[i+1]=='I')) continue;
            else if((str[i]=='J' ||str[i]=='K' || str[i]=='L') &&
               (str[i+1]=='J' ||str[i+1]=='K' || str[i+1]=='L')) continue;
            else if((str[i]=='M' ||str[i]=='N' || str[i]=='O') &&
               (str[i+1]=='M' ||str[i+1]=='N' || str[i+1]=='O')) continue;
            else if((str[i]=='P' ||str[i]=='Q' || str[i]=='R' || str[i]=='S') &&
               (str[i+1]=='P' ||str[i+1]=='Q' || str[i+1]=='R' || str[i+1]=='S')) continue;
            else if((str[i]=='T' ||str[i]=='U' || str[i]=='V') &&
               (str[i+1]=='T' ||str[i+1]=='U' || str[i+1]=='V')) continue;
            else if((str[i]=='W' ||str[i]=='X' || str[i]=='Y' || str[i]=='Z') &&
               (str[i+1]=='W' ||str[i+1]=='X' || str[i+1]=='Y' || str[i+1]=='Z')) continue;

            count++;
        }

        printf("Case #%d: %d\n",++time,count-1);
    }
    return 0;
}

7-31 单链表的创建,遍历与销毁

从键盘输入任意多个正整数,输入以-1结束。逆序输出这些整数(不包括-1)。
提示:
1、逆序创建单链表。结点数据域是整型数。每输入一个整数,向链表中插入一个结点。当输入-1时结束链表的创建。
2、遍历链表,输出结点数据域的值。
3、遍历完成后,要求销毁该链表。

输入格式:
任意多的正整数,输入序列以-1结束。

输出格式:
逆序输出这些整数(不包括-1)。

输入样例:
在这里给出一组输入。例如:

3 8 2 9 7 4 -1
输出样例:
在这里给出相应的输出。例如:

4 7 9 2 8 3

#include <stdio.h>

int a[100009];
int main(){
    int i=0;
    while(scanf("%d",&a[i]) && a[i]!=-1){
        i++;
    }
    for(int s=i-1;s>=0;s--) 
        printf("%d ",a[s]);
    return 0;
}

7-36 有多少位是7?

从键盘读入一个4位数的整数,求该数中有多少位是7

输入格式:
一个4位数的整数

输出格式:
该整数中7的个数

输入样例:
在这里给出一组输入。例如:

4757
输出样例:
在这里给出相应的输出。例如:

2

#include <stdio.h>

int main(){
    int n;scanf("%d",&n);
    int ans=0;
    while(n){
        int x=n%10;
        n/=10;
        if(x==7) ans++;
    }
    printf("%d",ans);
    return 0;
}

7-37 选择排序

本题要求从键盘读入n个整数,对这些数做选择排序。输出选择排序每一步的结果和最终结果。

输入格式:
输入的第一行是一个正整数n,表示 在第二行中会有n个整数。

输出格式:
输出选择排序每一步的结果和最终结果。

输入样例:
在这里给出一组输入。例如:

5
3 7 2 9 1
输出样例:
在这里给出相应的输出。例如:

step 1: 1 7 2 9 3
step 2: 1 2 7 9 3
step 3: 1 2 3 9 7
step 4: 1 2 3 7 9
sorted array: 1 2 3 7 9
注意:
输出的冒号 : 是英文输入法下的符号,冒号后有一个空格。每个整数后有一个空格。

#include <stdio.h>

void print(int arr[], int n, int t) {
    printf("step %d: ", t);
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

void printS(int arr[], int n) {
    printf("sorted array: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

void SelectSort(int a[], int n) {
    int time = 1;
    for (int i = 0; i < n - 1; i++) {
        int min = a[i], min_Index = i, flag = 0;
        for (int j = i + 1; j < n; j++) {
            if (a[j] < min) {
                min = a[j];
                min_Index = j;
                // flag = 1; // 此趟有交换,此题不考虑
            }
        }
        // if (flag) {
            int temp = a[i];
            a[i] = a[min_Index];
            a[min_Index] = temp;
            print(a, n, time);
            time++;
        // }
    }
    // 输出排序完成后的数组
    printS(a, n);
}

int main() {
    int n;
    scanf("%d", &n);
    int a[1000];
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    SelectSort(a, n);

    return 0;
}

7-38 翻转单词顺序

给定一个字符串,翻转该字符串,翻转时单词中的字符顺序不变。例如,如果字符串为"Hello World",则翻转后为"World Hello"。单词间以一个或多个空格分隔。注意,字符串开头和结尾都可能有多个空格。输出时去掉多余的空格。只在每个单词之间以1个空格间隔。输出的每行末尾没有空格。

输入格式:
输入可能包括多行。每行代表一个字符串,除了空格外,标点符号和普通字母一样处理。你可以认为一行的字符总数不会超过50000个,单词数不会超过600,每个单词的长度也不会超过30。

输出格式:
输出包括多行,每行对应输入的一行,为翻转后的字符串。输出时去掉多余的空格。只在每个单词之前以1个空格间隔。输出的每行末尾没有空格。

输入样例:
在这里给出一组输入。例如:

student. a am I
World Hello
输出样例:
在这里给出相应的输出。例如:

I am a student.
Hello World

// 方法一
#include <stdio.h>
#include <string.h>

// 先整体逆置,再每个单词逆置,适用于无多余空格的情况
void reverse(char str[],int l,int r){
    while(l<r){
        char temp=str[l];
        str[l]=str[r];
        str[r]=temp;
        l++;r--;
    }
}
char str[50009];
int main(){
    while(gets(str)){
        // getchar();
        // 整体逆置
        int n=strlen(str);
        reverse(str,0,n-1);
        // 每个单词的逆置
        for(int i=0;str[i]!='\0';i++){
            int len=0;
            int j=i;
            while(str[j]!=' ' && str[j]!='\0'){
                len++;
                j++;
            }
            reverse(str,i,i+len-1);
            i+=len;
        }
        // 去除多余的空格
        // 缩小左右边界
        char ans[50009];
        int index=0;
        int l=0,r=n-1;
        while(str[l]==' ')l++;
        while(str[r]==' ')r--;

        int flag=1;
        for(int i=l;i<=r;i++){
            if(str[i]==' ' && flag==1){
                ans[index++]=str[i];
                flag=0;
            }else if(str[i]!=' '){
                ans[index++]=str[i];
                flag=1;
            }
            
        }
        ans[index]='\0';
        for(int i=0;ans[i]!='\0';i++) printf("%c",ans[i]);
        printf("\n");
    }
    return 0;
}
// 方法二
#include <stdio.h>
#include <string.h>

int main(){
    char str[50009];
    while(gets(str)){
        // getchar();
        int n=strlen(str);
        char* p=str+n-1;
        int flag=1;
        while(n>=1){
            int count=0;
            while(*p==' ' && n>=1){*p='\0';p--;n--;}
            while(*p!=' ' && n>=1){p--;n--;count++;}
            if(count>=1 && flag){
                printf("%s",p+1);
                flag=0;// 单词间的空格
            } 
            else if(count>=1 && !flag)printf(" %s",p+1);
        }
        printf("\n");
    }
    return 0;
}

7-39 求因子和最大的数(结构体排序)

我们定义正整数的因子和指1个正整数的因子中,不包括自己的其它所有因子之和。例如,4的因子和是1+2=3,6的因子和是1+2+3=6,7的因子和是1,8的因子和是1+2+4=7,9的因子和是1+3=4。我们约定1的因子和是0。
本题要求你编程求一组正整数中因子和最大的数。

输入格式:
输入包括2行。
第一行是1个正整数n,表示第2行会有n个正整数。

输出格式:
输出第2行的n个正整数中因子和最大的那个数。

输入样例:
5
4 6 7 8 9
输出样例:
8

#include <stdio.h>


typedef struct MaxNum{
    int num;
    int sum;
}Max;
int cmp(const void* e1,const void* e2){
    const Max* a=(const Max*)e1;
    const Max* b=(const Max*)e2;
    return b->sum - a->sum;
    // return ((Max*)e2)->sum - ((Max*)e1)->sum;
}
int main(){
    Max m[1009];
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&m[i].num);
    for(int i=0;i<n;i++){
        int count=0;
        for(int j=1;j<m[i].num;j++){
            if(m[i].num%j==0) count+=j;
        }
        m[i].sum=count;
    }
    qsort(m,n,sizeof(Max),cmp);
    printf("%d",m[0].num);
    return 0;
}

7-40 按因子和排序(结构体排序)

我们定义正整数的因子和是不包括自己的其它所有因子之和。例如,4的因子和是1+2=3,6的因子和是1+2+3=6,7的因子和是1,8的因子和是1+2+4=7,9的因子和是1+3=4。我们约定1的因子和是0。要求你编写程序,对一组正整数,按每个数因子和的大小,从小到大排序。测试数据保证输入的所有正整数因子和都各不相同。

输入格式:
输入有2行。第一行是一个正整数n,表示第二行会有n个正整数。第二行的每个正整数之间以空格隔开。

输出格式:
按因子和的大小从小到大输出n个正整数。每个数的输出包括该数和该数的因子和,因子和包括在一对小括号中。每个输出之后加入1个空格。

输入样例:
5
9 6 7 4 8
输出样例:
7(1) 4(3) 9(4) 6(6) 8(7)

#include <stdio.h>
#include <stdlib.h>

struct Sum{
    int num;
    int s;
};
int cmp(const void* e1,const void* e2){
    struct Sum* a=(struct Sum*)e1;
    struct Sum* b=(struct Sum*)e2;
    
    return a->s - b->s;
}
int main(){
    struct Sum arr[1009];
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&arr[i].num);
    // 求因子和
    int sum;
    for(int i=0;i<n;i++){
        sum=0;
        for(int j=1;j<arr[i].num;j++){
            if(arr[i].num%j==0) sum+=j;
        }
        arr[i].s=sum;
    }
    qsort(arr,n,sizeof(struct Sum),cmp);
    for(int i=0;i<n;i++) printf("%d(%d) ",arr[i].num,arr[i].s); 
    return 0;
}
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值