【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分真的尽力了……先睡了,明天抄下答案看看能不能过吧。

 

posted @ 2021-02-09 01:10  魂淡菌  阅读(80)  评论(0)    收藏  举报