![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
PAT乙级考试
fish_winter
这个作者很懒,什么都没留下…
展开
-
PAT乙级考试-1034 有理数四则运算 (20分)
题目思路本题的关键是要知道怎么求最大公约数来进行化简,这里采用辗转相除法来计算。知道如何化简后,依次录入,化简,计算,打印即可#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct{ long long int fz; long long int fm; long long int zs;}number;long long int gy(long long in原创 2020-07-22 17:44:05 · 162 阅读 · 0 评论 -
PAT乙级考试-1033 旧键盘打字 (20分)
题目思路录入数据将坏键录入ban[]数组,应该输入的字符串录入ch[]数组这里需要使用fgets()函数来录入数据,因为坏键有可能是空的,如果用scanf()函数来录入数据在这种情况下就会跳过第一个空行,导致有一个用例无法通过;2.判断遍历整个ch[]数组,先判断该字符和该字符的大写形式是否在bad[]数组(由于toupper函数不会处理非大写字母,所以可以直接使用),如果在,则跳过,如果不在,根据bad数组是否有‘+’再判断该字符是否是大写字母,如果是,则跳过,否则输出#includ原创 2020-07-22 00:24:18 · 138 阅读 · 0 评论 -
PAT乙级考试-1032 挖掘机技术哪家强 (20分)
题目思路由于学校的编号是从1开始连续编号,所以学校编号最大不会超过参赛人数n;由此,我们用一个数组score[]来表示每个学校的得分,编号为i的学校的得分就储存在score[i]中;计算完成后,再打印出得分最高的学校编号和得分即可#include<stdio.h>#include<stdlib.h>int main(void){ int n, id, gra, maxs, maxi, i; scanf("%d", &n); int* score = (原创 2020-07-21 23:16:56 · 233 阅读 · 0 评论 -
PAT乙级考试-1031 查验身份证 (15分)
题目思路(1)使用一个test[]数组来录入当前的号码,使用一个wrong[][]来储存所有有问题的号码,再将权值表和最后一位的字符表用数组储存起来,方便运算(2)每录入一个号码,就计算其权值以及其对应的第十八位字符是否正确,在计算的过程中顺便检测号码中是否有不是数字的字符,如果有,直接将该号码放入wrong数组,否则计算出对应的字符后和第十八位比较,再决定是否放入wrong数组(3)根据wrong数组的元素数量,打印对应的内容即可#include<stdio.h>#inclu原创 2020-07-21 23:03:11 · 193 阅读 · 0 评论 -
PAT乙级考试-1030 完美数列
题目思路观察题目,假如我们确定了一个数列的最小值m,则在给出的数字中找出不大于mp的最大数字M,再加上所有位于m和M中间的数字,即是这个最小值m对应的元素最多的完美数列;根据这个逻辑,有(1)录入数据,注意这里虽然给出的数字和P都在int的范围内,但是m*p就不一定在了,所以我们用long long int存储数据;用int 的话最后一个用例会无法通过(2)对整个数据排序,这里使用了快速排序;(3)从数列的最小值开始,确定用该值m作为最小值对应的长度最长的完美数列的长度;方法是使用二分查找找出原创 2020-07-21 22:24:37 · 111 阅读 · 0 评论 -
PAT乙级考试-1029 旧键盘
题目思路将应该输出的文字放入right[]数组,将实际输出的文字放入wrong[]数组,将坏键字母放入word[]数组(1)先将wrong[]数组和right[]数组的字母都转换为大写(2)依次遍历right[]数组中的字符,如果该字符在wrong[]数组中没有,在word[]数组中也没有,则将该字符放入word数组(3)打印即可#include<stdio.h>#include<string.h>int main(void){ int i, k = 0;原创 2020-07-21 17:00:24 · 97 阅读 · 0 评论 -
PAT乙级考试-1028 人口普查
题目思路录入数据(1)使用一个结构people来保存每个人的信息,成员包括名字和出生日期(2)初始创建一个max和一个min,表示年级最大的人和年级最小的人,其中max的初始birth应该比任何有效数据的birth都大,min的初始birth应该比任何有效数据的birth都小,使得任何有效数据都可以覆盖初始值(3)名字直接录入name[]数组,出生日期先以字符串的形式录入temp[]数组,再用trans函数转换为数字再赋值给birth(4)每录入一个有效数据,计数的count++,且和ma原创 2020-07-21 16:20:37 · 146 阅读 · 0 评论 -
PAT乙级考试-1027 打印沙漏
题目思路本题的关键在于弄清楚行数和每行应该打印的符号的个数;(1)首先求出应该打多少行和打完剩余的个数,这里我设定的参数是n为除沙漏中间一行外两边增加的行数,即总行数=2n+1;(2)通过数列的知识不难求出在给定的符号数量下n的最大值,有了这个层数数据后,再找出每一层应该打的符号数量和层数i的关系;(3)这里我将其分为上面的n层和下面的n-1层,对于上下的任意一层第i层,都有先打印n-i-1个空格,再打印2i+1个符号的关系;注意每一行的左边打出空格即可,右边不需要打;#include<原创 2020-07-21 15:40:41 · 151 阅读 · 0 评论 -
PAT乙级考试-1026 程序运行时间
题目思路本题比较简单,得到准确时间t后先取其整数部分t0求得时分秒,再根据其小数部分确定是否要在秒上加1即可;但本题有一个要求是表述不清的,在“输出格式”的最后又“不足 1 秒的时间四舍五入到秒”,但并未提及如果四舍五入到秒后如果秒数达到60是否要继续向上进位;经过测试不论是否进位都能通过测试,说明测试用例并未考虑这种情况。所以本题取简单的不进位代码为准,但实际上也简单不了多少;#include<stdio.h>#define CLK_TCK 100int main(void)原创 2020-07-21 13:29:47 · 206 阅读 · 0 评论 -
PAT乙级考试-1025 反转链表
题目思路由于每个结点的地址都由数字给出,自然考虑使用静态链表;地址由于是5位数,则创建一个容量为100001的l[]数组,0~99999储存结点,100000为头指针;则结点的脚标即为结点的自身地址,要得到下一个节点的指针只需要l[adress].next即可录入数据使用结构node来储存每个结点的信息,node包含data成员和next成员,其自身地址直接用结点所在的数组脚标表示,不再单独储存;录入时先录入结点自己的地址,在根据结点自己的地址在对应位置录入data和next数据这里虽然题原创 2020-07-21 12:27:12 · 218 阅读 · 0 评论 -
PAT乙级考试-1024 科学计数法
题目思路拆分数据首先使用sor[]数组将整个字符串录入,然后有(1)使用tag1表示最前面的正负号,tag2表示指数的正负号;(2)使用major数组录入第一个符号之后,‘E’之前的主体部分,并且顺带求出主体部分的小数位数n1;(3)使用index算出指数的大小打印数据(1)tag1==‘-’时打印(2)index0时单独处理,直接把major数组整个打出即可;(3)tag2‘-’时,先打印一个“0.”,再打印index-1个0,再打印major数组中不为‘.’的部分(4)tag原创 2020-07-20 22:23:53 · 143 阅读 · 0 评论 -
PAT乙级考试-1023 组个最小数
题目思路该题主要是要看清题目,给出的是0~9数字的个数,而不是直接给的数字;明确题意后就比较简单了,使用res[]数组储存每个数字的个数,由于至少有一个非零的数字,则先找到最小的非零数字将其输出一个,然后再从大到小依次输出所有数字即可#include<stdio.h>int main(void){ int res[10] = { 0 }; int i, j; for (i = 0; i < 10; i++) scanf("%d", &res[i]); f原创 2020-07-20 19:13:28 · 87 阅读 · 0 评论 -
PAT乙级考试-1022 D进制的A+B
题目思路观察可知A+B的在int的表示范围内,直接使用int存储数据,并使用递归的方法求出其d进制表示即可;注意使用递归法要单独处理A+B=0的情况#include<stdio.h>void compute(int n, int b){ if (n == 0) return; compute(n / b, b); printf("%d", n % b);}int main(void){ int a, b, d; scanf("%d%d%d", &a,原创 2020-07-20 18:53:11 · 88 阅读 · 0 评论 -
PAT乙级考试-1021 个位数统计
题目思路该题很简单,通过除余法求得每一位数字后再统计数量并输出即可#include<stdio.h>int main(void){ char n[1000]; int res[10] = { 0 }; scanf("%s", n); for (int i = 0; n[i] != '\0'; i++) res[n[i] - '0']++; for (int i = 0; i < 10; i++) if (res[i] != 0) printf("%d原创 2020-07-20 18:42:32 · 105 阅读 · 0 评论 -
PAT乙级考试-1020 月饼
题目思路根据题意,我们是优先选择单价高的月饼出售,直到满足需求为止,但是题目中有一个隐藏的条件没有给出,如果所有月饼的库存之和都不满足需求,则将所有月饼全部出售的价格即是最终的收益。不考虑该条件会有一个用例错误;录入数据使用一个结构数组来保存每一种月饼的数据,结构成员包括store:库存,money:总价,price:单价按照price递减的顺序排序,这里使用了直接插入排序;按照price从高到低依次遍历,如果第i种月饼的库存小于需求,则需求减少该种月饼库存的量,收益增加该种月饼总价的量,原创 2020-07-20 17:45:09 · 144 阅读 · 0 评论 -
PAT乙级考试-1019 数字黑洞
题目思路(1)首先获取n,n==6174作为一种情况单独处理(2)使用op()函数将n拆分为4个数字放在num[]数组中,不足的位数用0补足(3)使用compute()函数计算num[]数组中的4个数字可以组成的最大值和最小值,并返回给n1和n2;该函数操作后会将num[]数组中的数字变为降序排列(4)使用prt()函数打印n1-n2=n3的等式;(5)将n3的值赋给n,若n不是0或者6174,回到第2步;注意:等式中的‘-’和‘=’左右都有空格#include<stdio.h&原创 2020-07-20 17:04:55 · 82 阅读 · 0 评论 -
PAT乙级考试-1011 1018 锤子剪刀布
题目思路数据统计由于本题需要输出甲乙胜利次数最多的手势,所以我们需要统计甲乙每次胜利的手势即对应的次数,由于甲胜和乙负相对应,所以我们只需要统计甲和乙各自每个手势胜利的次数即可;另外这里创建了一个hand数组方便最后输出次数最大的手势,注意数据按照B C J的顺序,这样方便最后寻找最大值;综上,使用j[3]数组表示甲各种手势的胜利次数,j[0]表示甲出B胜利,j[1]表示甲出C胜利,j[2]表示甲出J胜利,j[3]表示甲乙平局;y[3]数组表示已类似;数据打印甲的胜利次数对应乙的原创 2020-07-20 16:20:01 · 86 阅读 · 0 评论 -
PAT乙级考试-1017 A除以B
题目思路录入数据由于给出的A很大,所以使用一个数组来存储A,然后依次计算每一位的商和余数计算(1)使用数组res[]来存放每一位的商(2)使用rem来表示每一位的余数(3)显然,第i位作为被除数时,其值为第i-1位的余数*10+第i位的值,用该值除以除数b,即得到第i位的商和余数,依次类推即可;第一位的前置余数为0,最后一位的余数即为最终的余数;打印由于结果数组res中前面数位可能是0,所以先去除其中的0,再依次打印商的每一位即可;若商全是0,则需要手动输出一个0来表示商;#i原创 2020-07-20 15:36:07 · 137 阅读 · 0 评论 -
PAT乙级考试-1016 部分A+B
题目思路该题目很简单,因为A,B都很大,自然使用数组来存储,然后计算出Pa和Pb即可#include<stdio.h>int compute(char a[], int da){ int count = 0, sum = 0; for (int i = 0; a[i] != '\0'; i++) if (a[i] - '0' == da) count++; for (int i = 0; i < count; i++) sum = sum * 10 +原创 2020-07-20 15:12:59 · 120 阅读 · 0 评论 -
PAT乙级考试-1015 德才论
题目思路个人认为这道题是前15道题中最难的一道;主要分为三步录入数据并分类使用一个结构数组来记录所有学生的信息,结构数组有一个type成员来区分每个学生的类别,-1表示淘汰,0~3类考生的优先级依次降低(0类表示德才兼备,以此类推)对数据排序(1)由于判断条件很多,写一个judge函数判断两个学生在打印时的先后顺序,这里优先按照type递增的顺序排序,打印时只需要跳过最前面type==-1的部分即可,其余元素的优先顺序按照题目中所给的写出(2)一开始排序时采用了直接插入排序,有三原创 2020-07-20 13:58:15 · 338 阅读 · 0 评论 -
PAT乙级考试-1014 福尔摩斯的约会
题目思路本题的难点又在于理解题意,观察输入输出样例和自己实测,题目中的“第一对相同的大写字母”是要求这两个字母要“值相同且在各自串中的位置相同”,这无疑大大降低了难度,如果没有位置相同的条件,确定第一对相同的大写字母要困难不少;后面两个数据类似另外,由于一周只有7天,则标识星期的数据必须限制在A~G,类似的标识小时的数据必须在0到9以及A到N之间,实测如果没有这两个条件,只限制在A到Z之间各会有一个用例无法通过理清楚题意后就比较简单里,设置day,hour,min三个变量各自统计出结果,再按照规原创 2020-07-20 10:47:27 · 153 阅读 · 0 评论 -
PAT乙级考试-1013 数素数
题目思路注意这里是找第m个素数到第n个素数,不是m到n中的素数明确题意后就比较简单,先找到第m个素数,再从第m个素数开始录入n-m+1个素数,再将其打印即可#include<stdio.h>#include<stdlib.h>int judge(int i){ if (i == 1) return 0; for (int j = 2; j * j <= i; j++) if (i % j == 0) return 0; return 1;原创 2020-07-20 09:21:44 · 86 阅读 · 0 评论 -
PAT乙级考试-1012 数字分类
题目思路该题比较简单,按照要求求出各个数字即可;由于A4是浮点数,这里就不使用数组。#include<stdio.h>int main(void){ int num; int a1, a2, a3, a5, n; int count1, count2, count4; double a4 = 0; int flag = 1; a1 = a2 = a3 = a5 = count1 = count2 = count4 = 0; scanf("%d", &n);原创 2020-07-20 08:41:16 · 141 阅读 · 0 评论 -
PAT乙级考试-1011 A+B 和 C
题目思路该题目很简单,只需要注意需要录入的数字是超过了int的最大范围,所以我们使用long long int来录入数据即可#include<stdio.h>int main(void){ int res[10] = { 0 }; int k; long long int a, b, c; scanf("%d", &k); for (int i = 0; i < k; i++) { scanf("%lld %lld %lld", &a, &a原创 2020-07-19 23:58:00 · 170 阅读 · 0 评论 -
PAT乙级考试-1010 一元多项式求导
题目思路客观上来说该题目不是很难,但是感觉题意是有歧义的,题中先说只输出非零项的系数和指数,最后一句话又很难理解,经过验证才明白是如果输出空串必须输出“0 0”的意思分为2步录入数据该题的主要难度在于此,一开始没有想到如何验证录入完成。这里采用一个结构数组来录入多项式每一项的系数和指数,另外用一个flag来记录每一对系数和指数之后的字符,如果是‘\n’则说明已经录入完成;另外用一个flag2来记录是否输出过数据输出数据注意指数为0的求导后不再输出;这里采用前置空格输出的形式,第一项的原创 2020-07-19 23:46:59 · 93 阅读 · 0 评论 -
PAT乙级考试-1009 说反话
问题思路录入数据本题的关键就在于如何录入数据,在C语言的范畴下,使用一个二维数组录入,每当录入到‘ ’时即认为录完了一个单词,并将录入的‘ ’替换为‘\0’方便打印,录入到‘\n’时认为录入结束,也将‘\n’替换为‘\0’打印数据倒叙打印即可,最后一个位置不打印空格另外本题由于是倒叙输出,也可以考虑使用栈#include<stdio.h>int main(void){ char p[80][80]; int i, j; i = j = 0; p[i][j] =原创 2020-07-19 22:10:54 · 122 阅读 · 0 评论 -
PAT乙级考试-1008 数组元素循环右移问题
问题思路这个问题和将数组的前N-M个元素和后M个元素整体位置互换(两组元素内的相对位置不变)本质上是一个问题,采用经典算法(1)先将整个数组的元素位置翻转(2)再将前M个元素位置翻转(3)最后将后N-M个元素位置翻转另外需要注意,要用M=M%N处理M,否则当M>N时会报错#include<stdio.h>#include<stdlib.h>void reverse(int p[], int low, int high, int size){ int mid原创 2020-07-19 21:30:20 · 96 阅读 · 0 评论 -
PAT乙级考试-1007 素数对猜想
题目思路求出1~N的所有素数,将其存入b数组,再统计差是2的相邻素数对的个数,打印即可#include<stdio.h>#include<stdlib.h>int judge(int i){ if (i == 0 || i == 1) return 0; for (int j = 2; j * j <= i; j++) if (i % j == 0) return 0; return 1;}int main(void){ int n原创 2020-07-19 16:51:11 · 83 阅读 · 0 评论 -
PAT乙级考试-1006 换个格式输出整数
题目思路该题目比较简单,使用除余法求得每一位的数字后,按规则输出即可#include<stdio.h>int main(void){ int num, i; int data[3] = { 0 }; scanf("%d", &num); for (i = 0; num > 0; num /= 10) data[i++] = num % 10; for (i = 2; i >= 0; i--) if (i == 2) for (int原创 2020-07-19 16:14:38 · 73 阅读 · 0 评论 -
PAT乙级考试-1005 继续3n+1猜想
题目思路录入数据由于题目中限定数字最大为100,建立一个容量为101的num数组来储存数字,初始值均为0,每录入一个数字i,将num[i]=1;我们规定num[i]==0表示i未出现,num[i]==1表示i出现,num[i]==2表示i被覆盖判断覆盖数字我们称一个数字i在递推到1的过程中出现的数字为i的路径,如3的路径为5、8、4、2、1;依次检测每个数字,若数字i出现且未被覆盖,即num[i]==1,则将其路径上所有小于等于100的数字都标记为覆盖。这里虽然输入的数字小于等于1原创 2020-07-19 16:01:17 · 181 阅读 · 0 评论 -
PAT乙级考试-1004成绩排名
题目思路录入数据使用结构people存储单个成员的所有信息,并且在录入的时候一边录入一边比较大小,录入数据完成后也得到了成绩的最大者和最小者打印数据#include<stdio.h>#include<stdlib.h>typedef struct{ char name[11]; char num[11]; int fra;}people;int main(void){ int n; int min, max, i; scanf("%d",原创 2020-07-19 13:15:12 · 131 阅读 · 0 评论 -
PAT乙级考试-1003 我要通过!
题目思路录入数据由于给出的字符串数量不多,建立一个二维数组保存原始的字符串,录入字符串时,注意把每行最后的\n替换为\0,方便后续的判断;再建立一个数组保存结果用于打印。判断字符串是否符合要求前两个条件很好理解,这里不再赘述对于第三个条件,我们设串中‘P’前面的‘A’有l个,‘P’和‘T’中间的‘A’有m个,‘T’后方的‘A’有n个,有以下三个结论(1)若一个串C的m>1且满足条件,则必然有一个前置串C’也满足条件,C’中l’=l,m’=m-1,n’=n-l;(2)根据上一原创 2020-07-19 12:18:52 · 80 阅读 · 0 评论 -
PAT乙级考试-1002 写出这个数
PAT乙级考试-1002 写出这个数思路 分为3步 1.录入数据 由于数字很大,正常使用整形变量肯定无法储存,考虑使用一个字符数组来储存数字,再转换为正常数字 2.转换数据 通过累加将字符数组中的数据的各位数之和sum求出 3.打印数据 使用一个字符串数组来存放每个数字对应的中文字符 将各位数之和sum通过取余的方式取出每一位的数字 打印每一位数字的中文字符,注意最后一位不打印空格#include<stdio.h>int main(void){ int原创 2020-07-18 23:45:09 · 159 阅读 · 2 评论