【PAT刷题】快速产出垃圾——2020-2-9

接昨晚B1024/A1073

(2)参考答案

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int main(){
 5     char str[10010];
 6     scanf("%s",str);
 7     int len = strlen(str);
 8     if(str[0]=='-') printf("-"); //如果是负数,输出负号
 9     
10     int pos =0;
11     while(str[pos]!='E'){
12         pos++;
13     }
14     
15     int exp=0;
16     for(int i=pos+2;i<len;i++){
17         exp = exp*10 +(str[i]-'0');
18     }
19     if(exp==0){
20         for(int i=1;i<pos;i++){
21             printf("%c",str[i]);
22         }
23     }
24     
25     if(str[pos+1]=='-'){
26         printf("0.");
27         for(int i=0;i<exp-1;i++){
28             printf("0");
29         }
30         printf("%c",str[1]);
31         for(int i=3;i<pos;i++){
32             printf("%c",str[i]);
33         }
34     }
35     else{
36         for(int i=1;i<pos;i++){
37             if(str[i]=='.') continue;
38             printf("%c",str[i]);
39             if(i==exp+2 && pos-3 !=exp){
40                 printf(".");
41             }
42         }
43         for(int i=0;i<exp-pos+3;i++){
44             printf("0");
45         }
46     }
47     return 0;
48 }

再检查一下代码发现Eindex的类型取成char了。不过运行超时是真不知道为什么就是了。

 

B1048

(1)自己尝试

#include <cstdio>
#include <cstring>

char fs[13]={'0','1','2','3','4','5','6','7','8','9','J','Q','K'};

int main(){
    char a[110]={'0'};
    char b[110] ={'0'};
    scanf("%s%s",a,b);
    int index=1;
    int lena = strlen(a);
    int lenb = strlen(b);
    char out[110];
    int len = lena>lenb?lena:lenb;
    while(index<=lena || index<=lenb){
        char temp1 = index<=lena?a[lena-index]:'0';
        char temp2 = index<=lenb?b[lenb-index]:'0';
        if(index%2){
            out[len-index]=fs[(temp1-'0'+temp2-'0')%13];
        }
        else{
            out[len-index]=(temp2-temp1)>=0?(temp2-temp1+'0'):(temp2-temp1+10+'0');
        }
        index++;
    }
    for(int i=0;i<len;i++){
        printf("%c",out[i]);
    }
}

第一遍就过了两个测试点,这里很恶心的就是题目并没有说没有的位置当什么算。

然后就是注意小于等于和小于的区别,这个也导致了三个测试点没有过,很尴尬。

(2)参考答案

#include <cstdio>
#include <cstring>

const int maxn = 110;
char A[maxn],B[maxn],ans[maxn]= {0};
void reverse(char s[]){
    int len = strlen(s);
    for(int i=0;i<len/2;i++){
        int temp=s[i];
        s[i] = s[len-1-i];
        s[len-i-1]=temp;
    }
}
int main(){
    scanf("%s %s",A,B);
    reverse(A);
    reverse(B);
    int lenA =strlen(A);
    int lenB = strlen(B);
    int len = lenA>lenB?lenA:lenB;
    for(int i=0;i<len;i++){
        int numA = i<lenA?A[i]-'0':0;
        int numB = i<lenB?B[i]-'0':0;
        if(i%2==0){
            int temp = (numB+numA)%13;
            if(temp==10) ans[i] ='J';
            else if(temp==11) ans[i]='Q';
            else if(temp==12) ans[i] ='K';
            else ans[i] = temp+'0';
        }
        else{
            int temp=numB-numA;
            if(temp<0) temp+=10;
            ans[i] = temp+'0';
        }
    }
    reverse(ans);
    printf("%s",ans);
    return 0;
}

 

A1001

 1 using namespace std;
 2 
 3 #include <iostream>
 4 #include <string>
 5 #include <vector>
 6 
 7 
 8 int main() {
 9     int n;
10     int m;
11     cin >> n >> m;
12 
13     int sum = n + m;
14     string str1 = to_string(sum);
15     vector<char> newStr;
16 
17     bool flag = false;
18     if (str1[0] == '-') {
19         flag = true;
20         str1 = str1.substr(1, str1.size() - 1);
21     }
22     for (int i = 0; i < str1.size(); i++) {
23         newStr.push_back(str1[i]);
24 
25         if ((i + 1) % 3 == str1.size()%3 && i + 1 != str1.size()) {
26             newStr.push_back(',');
27         }
28 
29     }
30     if (flag == true) {
31         newStr.insert(newStr.begin(), '-');
32     }
33     str1.assign(newStr.begin(), newStr.end());
34 
35     cout << str1;
36     return 0;
37 }

之前写的先贴下,然后重新根据现在的写法写一遍。

(1)自己尝试

 1 #include <cstdio>
 2 
 3 int main(){
 4     int a,b;
 5     scanf("%d%d",&a,&b);
 6     int index=0;
 7     int c = a+b;
 8     int out[10];
 9     if(c<0){
10         printf("-");
11         c = -c;
12     }
13     if(c==0) printf("0");
14     while(c!=0){
15         out[index++] = c%10;
16         c/=10;
17     }
18     for(int i=index-1;i>=0;i--){
19         if((i+1)%3==0 && i!=index-1){
20             printf(",");
21         }
22         printf("%d",out[i]);
23 
24     }
25 }

 

(2)参考答案

1 if(sum>=1000000) printf("%d,%03d,%30d",sum/1000000,sum%1000000/1000,sum%1000)
2 ……

一种简便写法,可复用性不强,参考性不强。

 

A1005

 (1)自己尝试

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 char fs[10][8] = {"zero","one","two","three","four","five","six","seven","eight","nine"};
 5 
 6 int main(){
 7     char in[110];
 8     scanf("%s",in);
 9     int len = strlen(in);
10     int sum =0;
11     for(int i=0;i<len;i++){
12         sum+= in[i]-'0';
13     }
14     char out[110];
15     int j=0;
16     if(sum ==0) printf("zero");
17     while(sum!=0){
18         out[j++] = sum%10;
19         sum /=10;
20     }
21     for(int i=j-1;i>=0;i--){
22         printf("%s",fs[out[i]]);
23         if(i!=0) printf(" ");
24     }
25 }

注意0要单独讨论

(2)参考答案

可以用dfs写,学过再看。

 

A1035

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int modify(char password[]){
 5     int flag = 0;
 6     int len = strlen(password);
 7     for(int i=0;i<len;i++){
 8         if(password[i]=='1'){ 
 9             password[i] = '@';
10             flag =1;
11         }
12         if(password[i]=='0'){ 
13             password[i] = '%';
14             flag =1;
15         }
16         if(password[i]=='l'){ 
17             password[i] = 'L';
18             flag =1;
19         }
20         if(password[i]=='O'){ 
21             password[i] = 'o';
22             flag =1;
23         }
24     }
25     return flag; 
26 }
27 
28 int main(){
29     int n;
30     scanf("%d",&n);
31     char teams[1000][20];
32     char passwords[1000][20];
33     int num=0;
34     char team[20],password[20];
35     for(int i=0;i<n;i++){
36         scanf("%s%s",team,password);
37         int flag = modify(password);
38         if(flag==1){
39             strcpy(teams[num], team);
40             strcpy(passwords[num],password);
41             num++;
42         }
43     }
44     if(n==1 && num==0) printf("There is 1 account and no account is modified");
45     else if(num==0) printf("There are %d accounts and no account is modified",n);
46     else{
47         printf("%d\n",num);
48         for(int i=0;i<num;i++){
49             printf("%s %s",teams[i],passwords[i]);
50             if(i!=num-1) printf("\n");
51         }
52 
53     }
54 }

这题用了个strcpy。

(2)参考答案

答案用结构体存了个是否已经修改的布尔变量,省去了strcpy,值得学习。

 

A1077

这题写得时候思想出了一些问题……直接看答案了

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 int n,minLen = 256,ans=0;
 7 
 8 char s[100][256]; 
 9 
10 int main(){
11     scanf("%d",&n);
12     getchar(); //读取时应该先把前面的换行符读了
13     for(int i=0;i<n;i++){
14         getline(s[i],300);
15         int len =strlen(s[i]);
16         if(len<minLen) minLen = len;
17         for(int j=0;j<len/2;j++){ //看到从后往前读的时候可以先翻转一下防止处理起来麻烦
18             char temp = s[i][j];
19             s[i][j] = s[i][len-j-1];
20             s[i][len-j-1] = temp;
21         }
22     }
23     for(int i=0;i<minLen;i++){
24         char c = s[0][i];
25         bool same = true;
26         for(int j=1;j<n;j++){
27             if(c!=s[j][i]){
28                 same =false;
29                 break;
30             }
31         }
32         if(same) ans++;
33         else break;
34     }
35     if(ans){
36         for(int i=ans-1;i>=0;i--){
37             printf("%c",s[0][i]);
38         }
39     }
40     else {
41         printf("nai");
42     }
43 }

总结以下几点:

①读取一行字符串的时候要用getchar()吸收换行符。

②从后往前读可以翻转从前往后读。

③字符串数字全部都要遍历。

 

A1082

(1)自己尝试

 1 #include <cstdio>
 2 #include <cstring>
 3 char baiqianwan[8][6] = {"Shi","Bai","Qian","Wan","Shi","Bai","Qian","Yi"};
 4 char nums[10][6] ={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
 5 
 6 int zerosNum(int outNum[],int weishu,int begin){
 7     int zeros =0;
 8     if(outNum[begin]==0){
 9         zeros++;
10         for(int j=begin+1;j<weishu;j++){
11             if(outNum[j]==0) zeros++;
12             else break;
13         }
14     }
15     return zeros;
16 }
17 
18 int main(){
19     int a;
20     scanf("%d",&a);
21     int b =a;
22     if(a<0){
23         printf("Fu ");
24         a = -a;
25     }
26     int outNum[9];
27     int weishu =0;
28     do{
29         outNum[weishu] = a%10;
30         weishu++;
31         a/=10;
32     }while(a!=0);
33     for(int i=0;i<weishu/2;i++){
34         int temp1 = outNum[i];
35         outNum[i] = outNum[weishu-1-i];
36         outNum[weishu-1-i] = temp1;
37     }
38     for(int i=0;i<weishu;i++){
39         int zeros = zerosNum(outNum,weishu,i);
40         if(i!=0 && (i+zeros-1!=weishu-1 || (i==weishu-1 && zeros==0))){
41             printf(" ");
42         }
43         if(zeros==0 && (weishu-2-i)>=0) printf("%s %s",nums[outNum[i]],baiqianwan[weishu-2-i]);
44         else if(zeros==0 && (weishu-2-i)<0) printf("%s",nums[outNum[i]]);
45         else{
46             i+=zeros-1;
47             if(i!=weishu-1){
48                 if(weishu-i<5 && weishu-i+zeros>=5) printf("Wan ");
49                 printf("ling");
50             }
51             else if(weishu-i<5 && weishu-i+zeros>=5)  printf(" Wan");
52         }
53         if(b==0) printf("ling");
54     }
55 }

 题比较复杂不说太说内容了,本身转换成习惯说法这件事就没啥规律。抄一遍答案再。

(2)参考答案

按中文规则输出一个绝对值在9位以内的整数,需要明确以下两个规则:

①如果在数字的某节(例如个节、万节、亿节)中,某个非零位(该节的千位除外)的高位是零,那么需要在该非零位的发音前额外发音一个零。例如8080的发音为”ba qian ling ba shi“,8008的发音为”ba qian ling ba“,10808的发音为”yin Wan ling ba Bai ling ba“。

②每节的末尾要视情况输出万或亿。

 

NMD答案抄了半天看不出哪错了,算了这题过了。

 

posted @ 2021-02-10 13:56  魂淡菌  阅读(53)  评论(0)    收藏  举报