————浙大PAT题解————
浙大PAT题集
Wonz
后端 -> 全栈 -> 后端
技术很菜,但一直在学习。
「人们会被自己热爱的事物改变」
展开
-
B1021:个位数统计(15')
思路:一开始用的long long型,发现测试3一直过不去,然后改用字符串存储,就AC了。注意学会使用字符转整型数的方法。代码:/*//第三个测试点过不去#include<iostream>using namespace std;int main(){ long long x,m; int a[10] ={0},k; //初值都设为了0 ...原创 2018-07-23 22:32:58 · 489 阅读 · 0 评论 -
B1031:查验身份证(15')
思路:用数组存储权重,Z,M。然后每次输入进行判断,先判断前17位是否是整数,只要有一项不是就退出循环,根据j值即可判断是否合理。都是整数的话,就逐项乘以对应权重。循环结束之后,对11取模,再对应到Z,再对应M,和最后一位进行比较,如果不等的话,也是不合理的。每次找出一个合理的身份,pass+1,最后pass要和n比较,如果相等,即输出“All passed”。代码:#include...原创 2018-07-24 20:41:20 · 343 阅读 · 0 评论 -
B1002:写出这个数(20)
思路:用字符串存储,累加之后,辗转相除法,得到每一位。注意这时得到的是逆序,所以要倒着存储,再输出。注意特判,输入为0的时候,输出应该是"ling",牛客网有这个测试点。代码:#include<cstdio>#include<stdlib.h>#include<cstring>int main(){ char str[100]; ...原创 2018-07-24 21:04:35 · 333 阅读 · 0 评论 -
B1014:福尔摩斯的约会(20')
思路:首先用一个二维字符数组Day存储星期几(注意,这里数组第二维大小不能等于3, 而要大于3,否则会编译错误)。先找出前两个字符串中第一个相同的大写字母,这里字母范围应该限定在A~G之间,而不是A~Z。对应到Day数组输出星期。然后,继续在前两个字符串中,找剩下的里面第一个相同的字符,数字也符合。不过要注意0~23输出的时候,要判断是否第一位有数,没有的话用0补充。再在后两个字符串中,找第一...原创 2018-07-24 22:07:27 · 222 阅读 · 0 评论 -
A1061:Dating(20')
思路:同B1014。首先用一个二维字符数组Day存储星期几(注意,这里数组第二维大小不能等于3, 而要大于3,否则会编译错误)。先找出前两个字符串中第一个相同的大写字母,这里字母范围应该限定在A~G之间,而不是A~Z。对应到Day数组输出星期。然后,继续在前两个字符串中,找剩下的里面第一个相同的字符,数字也符合。不过要注意0~23输出的时候,要判断是否第一位有数,没有的话用0补充。再在后两个字...原创 2018-07-24 22:07:17 · 270 阅读 · 0 评论 -
B1024:科学计数法(20')
思路:先找到E的位置,用flag_E标记一下。然后计算flag_E+2位置一直到末尾的数,计算指数大小exp。然后根据E后面的“+-”号分类讨论。“-”:先判断字符串第一项是否为“-”,“-”输出,“+”不输出。然后先输出“0.”。再输出格式为0.000XXX。小数点后连续0的个数为exp-1,然后XXX就是原字符串str[3]一直到str[flag_E-1]的数字。“+”:分三种情况...原创 2018-07-26 22:02:15 · 681 阅读 · 0 评论 -
A1073:Scientific Notation(20')
思路:同乙级1024。先找到 E 的位置,用 flag_E 标记一下。然后计算 flag_E+2 位置一直到末尾的数,计算指数大小 exp。然后根据 E 后面的 “+-” 号分类讨论。“-”:先判断字符串第一项是否为 “-”,“-” 输出,“+” 不输出。然后先输出 “0.”。再输出格式为 0.000XXX。小数点后连续 0 的个数为 exp-1,然后 XXX 就是原字符串 str[3] ...原创 2018-07-26 22:05:23 · 291 阅读 · 0 评论 -
B1048:数字加密(20')
思路:用字符串数组存储。首先要反转一下字符串,因为是从个位开始计算的。然后i下标从0开始,所以奇偶也要反一下。其次,考虑到,A,B位数可能会不一样,不用单独拿出来讨论,直接在大循环中进行就行,不足的位补0即可。注意:取字符串中的数,要减去‘0’。整数存进字符串中,要加上‘0’。代码:#include<cstdio>#include<cstring>#i...原创 2018-07-27 21:03:44 · 289 阅读 · 0 评论 -
A1001:A+B Format(20')
思路:相加后,先判断是否为负数,负数单独输出'-',然后转成正数。用辗转相除法存进sum1数组。再逆序输出,每次逢3的倍数输出一个','。注意:要特判相加的和为0,单独输出。代码:#include<cstdio>int main(){ int a,b,sum = 0; scanf("%d%d",&a,&b); sum = a + b; if(...原创 2018-07-28 19:54:40 · 291 阅读 · 0 评论 -
A1005:Spell It Right(20')
思路将输出单独存进一个二维字符串数组中,遍历求各位上数的和,再用辗转相除法求出和的每一位数字,存进数组,最后逆序输出。注意特判 sum=0。代码#include<cstdio>#include<cstring>int main(){ char a[10][10] = {"zero","one","two","three","four原创 2018-08-03 20:06:21 · 289 阅读 · 0 评论 -
A1031:Hello World for U(20')
思路:列出前几种情况(N=5,6,7,8,9,10),找规律,发现n1始终是 (n+2)/3 向下取整 。n3和n1相等,因为左右两边相等,利用公式n2=n+2-n1-n3。注意:一开始我没想到找规律,而是根据题意,遍历找到n1的max,但是失败了,看了晴神的思路,发现原来这么神奇。还是要学会打表找规律啊。代码:#include<cstdio>#include<...原创 2018-07-22 21:24:06 · 276 阅读 · 0 评论 -
B1037:在霍格沃兹找零钱(20')
思路:将P和A统一到Knut单位,即Galleon*17*29,Sickle*29。然后先比较输出带不带负号。然后,分别输出G值,S值,K值。注意:G值=差值/(17*29),不是%。S值=(差值-G值*17*29)/29。K值=差值%29,也可以用差值-G值*17*29-S值*29。代码:#include<cstdio>int main(){ int G1,S1...原创 2018-07-22 21:57:00 · 328 阅读 · 0 评论 -
A1019:General Palindromic Number(20')
思路:利用进制转换模板先转化为b进制数。这里注意要用do while型,用while型可能会部分正确。同时,得到转换后的位数i。然后,进行回文判断,只需比较i/2次。只要有一次循环不符合回文条件,就输出“No”,直接退出循环。最后输出b进制数要逆序输出,不是回文的话如果正序输出就会出错。代码:#include<cstdio>int main(){ int n,b; ...原创 2018-07-22 22:24:48 · 273 阅读 · 0 评论 -
A1027:Colors in Mars(20')
思路:这是一道进制转换题,读懂题意就知道,只需把输入转化成13进制数就行。但要注意第一位没有数要输出0,以及怎么输出A,B,C。代码:(开始学C++了,代码风格可能是C和C++混搭,会慢慢调整的)#include<iostream>using namespace std;void output(int n){ char n1; if(n/13 == 0){ //...原创 2018-07-23 21:14:36 · 251 阅读 · 0 评论 -
A1058:A+B in Hogwarts(20')
思路:和B1037类似,不过这题是计算和,所以要考虑溢出,就改用long long型变量。代码:#include<cstdio>int main(){ long long G1,S1,K1,G2,S2,K2; //改用long long型,防止溢出 scanf("%lld.%lld.%lld %lld.%lld.%lld",&G1,&S1,&...原创 2018-07-23 21:45:04 · 252 阅读 · 0 评论 -
B1027:打印沙漏(20')
思路:找规律,找到沙漏从只有1个的那层到最多的那层一共有:2*i*i-1。于是,输入n之后,遍历找到i,即沙漏的一半层数,记为col。然后根据每行的空格和符号规律,对应输出。代码:#include<cstdio>int main(){ int n,col,left; char sign; scanf("%d %c",&n,&sign); for(...原创 2018-07-21 22:28:57 · 200 阅读 · 0 评论 -
A1006:Sign In and Sign Out(25')
思路:用结构体存储person。输入的时间不用按小时、分钟、秒来比较,可以直接组合成一个6位整数,1-2位为小时,3-4位为分钟,5-6位为秒,直接比较整数大小即可得到时间的先后。 然后每次输入,同时更新最早和最晚时间,并记录下标。最后直接根据下标输出号码。代码:#include<cstdio>struct person{ char number[20]; //学号...原创 2018-07-20 23:07:56 · 291 阅读 · 0 评论 -
B1028:人口普查(20')
思路:用结构体存储。每次输入先判断是否合理,在范围之内。分别比较上限和下限。合理的情况下,再更新old和young,最后输出。参考了晴神的代码思路。注意:要进行特判。有可能一个符合的都没有。代码:#include<cstdio>struct person{ char name[10]; int year; int month; int day;}a[100...原创 2018-07-21 20:55:54 · 457 阅读 · 0 评论 -
A1036:Boys vs Girls(25')
思路:每次输入,单独更新女生的最高分和男生的最低分,记录数组下标i。输出时女生和男生都要判断是否为Absent,所以girl和boy初值可以设为-1,便于判断。注意:gender输入时要用%c,如果设成了%s,则要用strcmp进行比较。字符串输入不用&。代码:#include<cstdio>struct student{ char name[20]; ...原创 2018-07-21 21:34:08 · 346 阅读 · 0 评论 -
B1041:考试座位号(15')
思路:本来想用三维数组存准考证号、试机座位号、考试座位号。但是发现准考证号要用long long型存储,但是发现不能。后改用结构体。输入的时候,以试机座位号为基准, 这样在查找的时候,就能直接根据试机座位号找出准考证号和考试座位号。代码:#include<cstdio>struct Student{ long long id; int examSeat;}test...原创 2018-07-16 21:31:52 · 297 阅读 · 0 评论 -
B1004:成绩排名(20')
思路: 用结构体存储。以分数为基准,每次输入数据,更新分数的max和min。注意:字符串数组大小要大于10,因为最后一位要存'\0',结构体大小要大于100。代码:#include<cstdio>#include<cstring>struct Student{ char name[11]; //字符串数组大小都要设大于10,存‘\0’ char ...原创 2018-07-16 22:17:40 · 298 阅读 · 0 评论 -
A1011:World Cup Betting(20')
思路:每次输入一组数据,就比较得出max,然后根据最大值输出对应的WTL。sum根据公式计算值。最后输出要按照四舍五入输出,Devc中输出结果不是四舍五入,但是PAT却能AC。 代码:#include<cstdio>int main(){ double x,y,z,sum=1.0; for(int i = 0;i < 3;i ++){ scanf("%lf...原创 2018-07-18 21:29:07 · 266 阅读 · 0 评论 -
B1010:一元多项式求导(25')
思路:用数组a[n]存多项式的系数m,n为多项式的指数。求导公式为a[i -1] = a[i] *i。求导后,a[i]必须清空为0,因为会影响后面的计算。求导要从低次项往高次项枚举,而输出则是要从高次项往低次项枚举。注意:有可能没有任何非零项,因此要输出0 0.代码:#include<cstdio>int main(){ int m,n,a[1010] = {0}...原创 2018-07-16 20:57:43 · 327 阅读 · 0 评论 -
B1030:完美数列(25')
思路:对数组a[N]从小到大排序,利用two pointers思想去解决。i从0开始,j从i+count开始。因为是找max的count,所以j初值设为i+count,不满足的话就直接j++。注意:m*p可能会越界,所以改用long long型。代码:#include<stdio.h>#include<algorithm>using namespace std;int...原创 2018-07-12 22:48:37 · 328 阅读 · 0 评论 -
A1085:Perfect Sequence(25')
思路:对数组a[N]从小到大排序,利用two pointers思想去解决。i从0开始,j从i+count开始。因为是找max的count,所以j初值设为i+count,不满足的话就直接j++。注意:m*p可能会越界,所以改用long long型。代码:#include<stdio.h>#include<algorithm>using namespace std;int...原创 2018-07-12 22:51:30 · 207 阅读 · 0 评论 -
B1032:挖掘机技术哪家强(20')
思路:输入的同时计算各编号的比赛分数之和。结束后再遍历一遍,找出最大值。注意:比赛分数和的数组取大于10^5的数,否则输出会溢出。代码:#include<stdio.h>int main(){ int n,result,max; scanf("%d",&n); int rank,score,sum[100010] = {0}; //sum尽可能取大一点,否则会出现输出...原创 2018-07-15 19:43:44 · 420 阅读 · 2 评论 -
B1009:说反话(20')
思路:将输入的字符串数组存入一个二维字符数组中,以空格为分界。逆序输出。最后一个单词不能输出空格。代码:#include<cstdio>#include<cstring>int main(){ char str1[100],str2[100][100]; int i = 0,j = 0,k = 0; gets(str1); //PTA不能用ge...原创 2018-07-15 20:21:46 · 274 阅读 · 0 评论 -
B1006:换个格式输出整数(15')
思路:对整数取模,再除以10,存取各位数值到数组中(只有三位)。然后百位、十位、个位分别输出相应要求的东西。注意:正整数n小于1000,所以每一位数字只会在0~9之间。如果while判断没有a[2]<=9,有可能n是十位数,a[2]没有值,存的是垃圾数据,这样就会输出很多的B。#include<stdio.h>int main(){ int n,a[3],j,i=0;...原创 2018-03-25 09:58:15 · 323 阅读 · 1 评论 -
B1008:数组元素循环右移问题(20')
思路:题目让输出最后结果,可以不用管过程,先输出N-M到N-1,再输出0到N-M-1。注意:M可能为0,就是输出原数组。M也可能比N大,所以要取模。还有就是,最后一个不能输出空格,所以要判断。代码:#include<cstdio>int main(){ int n,x; scanf("%d %d",&n,&x); x=x%n; //x可能比n...原创 2018-04-05 21:35:17 · 278 阅读 · 0 评论 -
B1011:A+B和C(15')
思路:用long long型存数字,防止范围过大。#include<stdio.h>int main(){ long long a[3]; int T,i,j; scanf("%d",&T); for(i=0;i<T;i++){ for(j=0;j<3;j++){ scanf("%lld",&...原创 2018-03-25 20:31:43 · 376 阅读 · 0 评论 -
B1012:数字分类(20')
思路:a1:被5整除的偶数就是被10整除。a2:用flag标记,进行错位相加。count:用来标记是否有满足条件的数字,如没有最后输出N。代码:#include<cstdio>#include<iostream>using namespace std;int main(){ int n; scanf("%d",&n); int a[n]...原创 2018-04-06 22:45:22 · 374 阅读 · 0 评论 -
B1016:部分A+B(15')
思路:用long long型进行输入。枚举A的每一位,然后和DA进行比较,相等用x=x*10+DA,进行记录。B同A。代码:#include<cstdio>int main(){ long long A,B,DA,DB,x,y; x=0; y=0; scanf("%lld %lld %lld %lld",&A,&DA,&B,&a...原创 2018-04-04 09:41:23 · 332 阅读 · 0 评论 -
B1018:锤子剪刀布(20')
思路:每次输入进行比较。甲负的次数就是乙赢的次数,不用额外记录。最后输出甲乙获胜最多的手势,因为要考虑解不唯一,所以我采用把结果枚举。按字典序,J次数必须大于B和C,C次数必须大于B,可以大于等于B,B大于等于B、J就行。注意:scanf会把'\n'读入,所以可能输入五组数据,就跳出结果了,要用getchar()来吸收。另外,判断要用if-else,不能用多个if,而没有else,这样会记录次数出...原创 2018-04-07 20:39:26 · 1363 阅读 · 0 评论 -
B1022:D进制的A+B(20')
思路:辗转相除法。两个注意点:1.A,B范围没超int型(<=2^31-1),但是加起来可能会超,用long long型(<=2^63-1)。2.用do while,因为可能一上来就是0。#include<stdio.h>int main(){ long long A,B; int D,i=0; int a[100]; scanf("%ll...原创 2018-03-18 20:06:35 · 293 阅读 · 0 评论 -
B1026:程序运行时间(15')
思路:用相减之后的数%100,取出最后两位,判断是否要四舍五入。小时位是c1/3600,分钟位是c1/60%60,秒位是c1%60。不过要注意一点,不足两位时,高位要用0补充。代码:#include<cstdio>int main(){ long long c1,c2; scanf("%lld %lld",&c1,&c2); c1=c2-c1;...原创 2018-04-04 10:12:52 · 341 阅读 · 0 评论 -
B1036:跟奥巴马一起编程(15')
思路:行数col要判断奇偶性。col为奇,列数row为col/2+1;col为偶,列数row为col/2。#include<stdio.h>int main(){ int i,j,col,row; //col为行数,row为列数 char c; scanf("%d %c",&col,&c); if(col%2==1){ ...原创 2018-03-18 19:02:36 · 306 阅读 · 0 评论 -
B1046:划拳(15')
思路:每次输入进行判断,符不符合划拳规则。注意先要判断全赢/全输,否则会影响喝酒次数。代码:#include<cstdio>int main(){ int n,n1,n2; n1=n2=0; scanf("%d",&n); int a1[n],a2[n],b1[n],b2[n]; for(int i=0;i<n;i++){ ...原创 2018-04-04 23:31:22 · 895 阅读 · 0 评论 -
B1002:写出这个数(20')
思路:主要就是整型和字符串型的相互转化,用sprintf实现。拼音数字提前放入数组。#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ char str[100]; int i,count,sum=0; char b[][5]={"ling","yi",...原创 2018-03-12 23:04:09 · 341 阅读 · 0 评论 -
B1001:害死人不偿命的(3n+1)猜想(15')
思路:循环判断。n为奇数,n=(3*n+1)/2;n为偶数,n/=2。#include<stdio.h>int main(){ int i,n; do{ scanf("%d",&n); } while(n>1000||n<=0); //输入不大于1000的正整数 if(n==1){ prin...原创 2018-03-16 19:32:27 · 337 阅读 · 0 评论 -
A1046:Shortest Distance(20')
思路:一开始输入N结点时,把距离存进数组中,这样后面输出就不用循环遍历了,否则会超时。另外,输入时要用1~n+1。代码:#include<cstdio>int main(){ int n; scanf("%d",&n); int a[n+1],sum=0; int dis[n+1]={0}; for(int i=1;i&l...原创 2018-04-08 23:24:55 · 238 阅读 · 0 评论