本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!