【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答案抄了半天看不出哪错了,算了这题过了。

浙公网安备 33010602011771号