【PAT刷题】快速产出垃圾——2020-2-8
A1019
任意进制的回文数。首先前边题我们可以得知进制转换结果应该用数组存,然后通过数组索引判断是否是回文即可。
(1)自己尝试
1 #include <cstdio> 2 3 bool huiwen(int out[],int index){ 4 if((index==1 || index==0) && out[0]==0) return true; 5 else if(out[0]==0) return false; 6 else { 7 for(int i=0;i<index/2;i++){ 8 if(out[i]!=out[index-1-i]) return false; 9 } 10 } 11 return true; 12 } 13 14 int main(){ 15 int n,b; 16 scanf("%d%d",&n,&b); 17 int out[35]; 18 int index=0; 19 while(n!=0){ 20 out[index] = n%b; 21 n = n/b; 22 index++; 23 } 24 if(huiwen(out,index)) printf("Yes\n"); 25 else printf("No\n"); 26 for(int i=index-1;i>=0;i--){ 27 printf("%d",out[i]); 28 if(i!=0) printf(" "); 29 } 30 31 }
很意外一遍过了。去看参考答案优化下。
(2)参考答案
除商取余的技巧写法:z[num++] = n%b;
然后就是判断回文前边的条件是不用加的,直接for循环就好
1 bool huiwen(int out[],int index){ 2 for(int i=0;i<index/2;i++){ 3 if(out[i]!=out[index-1-i]) return false; 4 } 5 return true; 6 }
如上。
A1027
(1)自己尝试
1 #include <cstdio> 2 3 4 int main(){ 5 int r,g,b; 6 scanf("%d%d%d",&r,&g,&b); 7 int color[6]; 8 color[1] = r%13; 9 color[0] = r/13; 10 color[3] = g%13; 11 color[2] = g/13; 12 color[5] = b%13; 13 color[4] = b/13; 14 printf("#"); 15 for(int i=0;i<6;i++){ 16 if(color[i]==10) printf("A"); 17 else if(color[i]==11) printf("B"); 18 else if(color[i]==12) printf("C"); 19 else printf("%d",color[i]); 20 } 21 }
这题也没太多可说的,根据参考答案优化下。
(2)参考答案
参考答案建立了一张映射表,这个思想很值得学习:
1 char radix[13] = {'0','1','2','3','4','5','6','7','8','9','A','B','C'}
减少了不少代码量,值得学习。
A1058
(1)自己尝试
1 #include <cstdio> 2 #include <stdlib.h> 3 int main(){ 4 int a1,a2,a3,b1,b2,b3; 5 scanf("%d.%d.%d %d.%d.%d",&a1,&a2,&a3,&b1,&b2,&b3); 6 int cha = b1*17*29 + b2*29+ b3 -a1*17*29 - a2*29 -a3; 7 printf("%d.%d.%d",cha/(17*29),abs((cha%(17*29))/29),abs((cha%(17*29))%29)); 8 }
改了之前那个题的代码,有个测试点没过,再认真读下题。
(2)参考答案
因为中间过程全转化成铜会导致溢出,搞成long long就好了
1 #include <cstdio> 2 #include <stdlib.h> 3 int main(){ 4 long long a1,a2,a3,b1,b2,b3; 5 scanf("%lld.%lld.%lld %lld.%lld.%lld",&a1,&a2,&a3,&b1,&b2,&b3); 6 long long cha = b1*17*29 + b2*29+ b3 +a1*17*29 + a2*29 +a3; 7 printf("%lld.%lld.%lld",cha/(17*29),abs((cha%(17*29))/29),abs((cha%(17*29))%29)); 8 }
抄下答案也,这个思想值得学习。
1 #include <cstdio> 2 #include <stdlib.h> 3 int main(){ 4 int a[3],b[3],c[3]; 5 scanf("%d.%d.%d %d.%d.%d",&a[0],&a[1],&a[2],&b[0],&b[1],&b[2]); 6 int carry=0; //进位 7 c[2] = (a[2]+b[2])%29; 8 carry = (a[2]+b[2])/29; 9 c[1] = (a[1]+b[1]+carry)%17; //获得1号位的结果 10 carry=(a[1]+b[1] +carry)/17; 11 c[0] = a[0]+b[0] +carry; 12 printf("%d.%d.%d",c[0],c[1],c[2]); 13 return 0; 14 }
3.6 字符串处理
终于到了万恶的字符串处理了!gtmd!
非常考验代码能力。
B1009
完蛋。
(1)参考答案
①简便写法
1 #include <cstdio> 2 3 int main(){ 4 int num=0; 5 char line[90][90]; 6 while(scanf("%s",&line[num])!= EOF){ 7 num++; 8 } 9 for(int i=num-1;i>=0;i--){ 10 printf("%s",line[i]); 11 if(i!=0) printf(" "); 12 } 13 }
②麻烦写法
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 6 int main(){ 7 char str[90]; 8 cin.getline(str,90); //由于pta编译器对gets不再支持,得改写法 9 int len= strlen(str),r=0,h=0; //r为行,h为列; 10 char ans[90][90]; 11 for(int i=0;i<len;i++){ 12 if(str[i]!=' '){ 13 ans[r][h++] = str[i]; 14 } 15 else{ 16 ans[r][h] = '\0'; //末尾的结束符\0 17 r++; 18 h=0; 19 } 20 } 21 for(int i=r;i>=0;i--){ //倒着输出单词即可 22 printf("%s",ans[i]); 23 if(i>0) printf(" "); 24 } 25 return 0; 26 }
道理都懂。。改gets很烦,得引用库,使用命名空间,然后再改变输入写法。
B1006
(1)自己尝试
#include <iostream> #include <string> using namespace std; string reverse(string a){ string b; for(int i = a.size()-1;i>-1;i--){ b+=a[i]; } return b; } int main() { string a; cin >> a; string b = reverse(a); string out1; for(int i=0;i<b.size();i++){ switch(i){ case 2: for(int j=0;j<b[i]-48;j++){ out1+='B'; } break; case 1: for(int j=0;j<b[i]-48;j++){ out1+='S'; } break; case 0: for(int j=0;j<b[i]-48;j++){ out1+= b[i]-j; } break; } } string out2 = reverse(out1); cout << out2; return 0; }
之前做过的结果,输入的是字符串。
(2)参考答案
参考答案输入的数字,然后用除10取余并存储到数组的方法进行输出,其他的区别的不大,题不难,过了。
B1021
(1)自己尝试
1 //这整数1000位,输入整数的格式是没办法解决的,直接输入字符串 2 #include <cstdio> 3 #include <cstring> 4 5 int main(){ 6 char in[1010]; 7 scanf("%s",in); 8 int len = strlen(in); 9 int out[1010] ={0}; 10 for(int i=0;i<len;i++){ 11 out[in[i]-48]++; 12 } 13 for(int i=0;i<1010;i++){ 14 if(out[i]!=0){ 15 printf("%d:%d\n",i,out[i]); 16 } 17 } 18 }
还是百度了下ascii码表,char和int差了48,这个每次都忘了,看看答案有啥解决办法没。
(2)参考答案
只要计算char型变量c与字符型'0'的ASCII码之间的距离! count[str[i]-'0']。
另一个想法,将大写字符转换为小写字母只需令’R‘-'A’+'a'。
简直是天才!
B1031
(1)自己尝试
1 #include <cstdio> 2 3 int quanzhong[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; 4 char Ms[11] ={'1','0','X','9','8','7','6','5','4','3','2'}; 5 6 int main(){ 7 int n; 8 scanf("%d",&n); 9 int sum; 10 int nums=0; 11 int flag; 12 for(int j=0;j<n;j++){ 13 flag=0; 14 sum = 0; 15 char temp[20]; 16 scanf("%s",temp); 17 for(int i=0;i<17;i++){ 18 sum = sum + quanzhong[i]*(temp[i]-'0'); 19 if((temp[i]-'0')>9) flag =1; 20 } 21 sum = sum%11; 22 int m = Ms[sum]; 23 if(m!=temp[17] || flag ==1){ 24 printf("%s\n",temp); 25 nums++; 26 } 27 } 28 if(nums==0) printf("All passed"); 29 30 }
也不知道这种题能说啥……背就完事了。少写几行代码降低下效率,不过问题不大。答案参考性也不大。
B1002
(1)自己尝试
1 #include <cstdio> 2 #include <cstring> 3 4 char change[10][5] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"}; //之前习惯性写成单引号了,c++里有区别。 5 6 int main(){ 7 char in[110]; 8 scanf("%s",in); 9 int sum=0; 10 int len =strlen(in); 11 for(int i=0;i<len;i++){ 12 sum+=in[i]-'0'; 13 } 14 int out[110]; 15 int len2=0; 16 while(sum!=0){ 17 out[len2++] = sum%10; 18 sum /= 10; 19 } 20 for(int i=len2-1;i>=0;i--){ 21 printf("%s",change[out[i]]); 22 if(i!=0) printf(" "); 23 } 24 }
之前用C#写过这题,这里用数组存映射重新写了一遍。字符串数组就是二维字符数组。
B1014/A1061
SB题,脑子有病,题目有歧义而且一堆没啥意义的东西。
(1)自己尝试
1 //sb题 2 #include <cstdio> 3 #include <cstring> 4 5 char days[7][4] = {"MON","TUE","WED","THU","FRI","SAT","SUN"}; 6 char hours[24] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','H'}; //这咋有个H。。 7 8 int getHour(char a){ 9 for(int i=0;i<=23;i++){ 10 if(hours[i]==a) return i; 11 } 12 return -1; 13 } 14 15 bool isBig1(char a){ 16 if(a>='A' && a<='G') return true; 17 return false; 18 } 19 bool isBig2(char a){ 20 if((a>='A' && a<='N') || (a>='0' && a<='9')) return true; 21 return false; 22 } 23 bool isZimu(char a){ 24 if((a>='A' && a<='Z') || (a>='a' && a<='z')) return true; 25 return false; 26 } 27 28 int main(){ 29 char in[4][70]; 30 for(int i=0;i<4;i++){ 31 scanf("%s",in[i]); 32 } 33 char out1; 34 char out2; 35 int index=0; 36 for(int i=0;i<70;i++){ 37 if(in[1][i]==in[0][i] && isBig1(in[0][i])){ 38 out1=in[1][i]; 39 index =i+1; 40 break; 41 } 42 } 43 for(int i=index;i<70;i++){ 44 if(in[1][i]==in[0][i] && isBig2(in[0][i])){ 45 out2=in[1][i]; 46 break; 47 } 48 } 49 int out3; 50 for(int i=0;i<70;i++){ 51 if(in[2][i]==in[3][i] && isZimu(in[2][i])) out3=i; 52 } 53 printf("%s %02d:%02d",days[out1-'A'],getHour(out2),out3); 54 }
改了很多还是有个测试点没过……看答案吧。
(2)果然还是数组写错了!很烦
B1024/A1073
1 #include <cstdio> 2 #include <cstring> 3 4 int getEindex(char a[]){ 5 for(int i=0;i<strlen(a);i++){ 6 if(a[i]=='E') return i; 7 } 8 return -1; 9 } 10 11 12 int main(){ 13 char in[10010]={0}; 14 scanf("%s",in); 15 int len=strlen(in); 16 char zhengfu =in[0]; 17 char Eindex = getEindex(in); 18 char Ezhengfu = in[Eindex+1]; 19 int sum=0; 20 int shuziLen = Eindex-2; 21 if(zhengfu=='-') printf("-"); 22 for(int i=Eindex+2;i<len;i++){ 23 sum=sum*10+(in[i]-'0'); 24 } 25 if(Ezhengfu =='+'){ 26 if(in[1]!='0') printf("%c",in[1]); 27 if(shuziLen-1<=sum){ 28 for(int i=3;i<Eindex;i++){ 29 printf("%c",in[i]); 30 } 31 //首先我们把最常见的超过小数点情况打印出来,那么我们获得的0的个数是sum-shuziLen+1 32 for(int i=0;i<sum-shuziLen+1;i++){ 33 printf("0"); 34 } 35 } 36 else{ 37 int flag; 38 for(int i=3;i<sum+3;i++){ 39 printf("%c",in[i]); 40 if(i==sum+2) flag=i+1; 41 } 42 printf("."); 43 for(int i=flag;i<Eindex;i++){ 44 printf("%c",in[i]); 45 } 46 } 47 } 48 else{ 49 printf("0."); 50 for(int i=0;i<sum-1;i++){ 51 printf("0"); 52 } 53 printf("%c",in[1]); 54 for(int i=3;i<Eindex;i++){ 55 printf("%c",in[i]); 56 } 57 } 58 }
19分真的尽力了……先睡了,明天抄下答案看看能不能过吧。

浙公网安备 33010602011771号