PTA - C语言国庆题集2

2024-08-28 04:04
文章标签 语言 国庆 pta 题集

本文主要是介绍PTA - C语言国庆题集2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 7-21 打妖怪
  • 7-22 统计连续高温的最大天数
  • 7-23 唱歌比赛打分
  • 7-24 找最长的字符串
  • 7-25 算龙脉
  • 7-26 DNA鉴定
  • 7-28 T9键盘
  • 7-31 单链表的创建,遍历与销毁
  • 7-36 有多少位是7?
  • 7-37 选择排序
  • 7-38 翻转单词顺序
  • 7-39 求因子和最大的数(结构体排序)
  • 7-40 按因子和排序(结构体排序)

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去重 -> str3char 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;
}

这篇关于PTA - C语言国庆题集2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113671

相关文章

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上