PAT (Basic Level) Practice

阅读: 评论:0

PAT (Basic Level) Practice

PAT (Basic Level) Practice

1001:害死人不偿命的(3n+1)猜想 (15)(完成)

#include<iostream>
using namespace std;int main(){int n,a=0;scanf("%d",&n);while(n!=1){if(n%2==0){n/=2;}else{n=(3*n+1)/2;}a++;}printf("%d",a);return 0;
}

 

1002:写出这个数 (20)(完成)

注意要点:

1.字符串数组的使用。使用方式:点击打开链接。

2.sprint的使用。点击打开链接。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
//有两个点:1.sprintf的使用。2.可以一边输入一边直接累加。//
char s[100];
char ans[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int main(){char ch;int sum=0;while((ch=getchar())!='n'){sum+=(ch-'0');}sprintf(s,"%d",sum);for(int i=0;s[i]!=0;i++){if(i>0){printf(" ");}printf("%s",ans[s[i]-'0']);}return 0;
}

 

1003:我要通过! (20 分)(AC:模拟)

注意要点:

完了补吧。第一个卡了好久。

#include<iostream>
#include<cstring>
using namespace std;
int main(){int n;scanf("%d" , &n);for(int i = 0 ;i < n ; i ++){string s;int a = -1000, b = -1000 , c = -1 , d = -1 , pcount = 0 , tcount = 0;;//d的值控制j的下标 // cin >> s;for(int j = 0 ; j < s.size() ; j ++){//判断所有的满足和不满足的字母// if(s[j]!= 'P'){if(s[j] != 'A'){if(s[j] != 'T'){break;}else{tcount ++;}}}else{pcount ++;}if(s[j] == 'P'){// 记录第一个a的数值// a = j;}if(s[j] == 'T'){// 记录第一个b的数值// b = j - a - 1;d = j;}}c = s.size() - d - 1 ;//记录c的数值// if(a * b == c && b > 0 && pcount == 1 && tcount == 1){//p和t的个数只能出现一次。a和b的个数需要拉的大一点,要不然容易出毛病。// printf("YES");}else{printf("NO");}if(i != n - 1){printf("n");//最后一行不打印// }}return 0;
}

 

1004:成绩排名 (20)(完成)

注意要点:

1.结构体的编程格式。

#include<iostream>
using namespace std;struct student{char name[15];char num[15];int grade;
}stu,M,m;
//这个地方有个技巧:我们不必把所有信息都输进去。我们只是判断最大值和最小值。//
int main(){int n,max=0,min=101;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%s %s %d",stu.name,stu.num,&ade);ade>max){max&#ade;M=stu;}ade<min){min&#ade;m=stu;}}printf("%s %sn",M.name,M.num);printf("%s %s",m.name,m.num);return 0;
}

 

1005:继续(3n+1)猜想 (25)(AC)

注意要点:

1.这题目是写的真是令人绝望。sum放在里面死活都不对,一拉到外面就全对了,你是不是坑爹了。

#include<iostream>
using namespace std;
int main() {int N , b , sum = 0;int a[10005] = { 0 };scanf("%d" , &N);for(int i = 0 ; i < N ; i++) {scanf("%d" , &b);if(a[b] == 2);else	a[b] = 1 ;while(b != 1) {if(b % 2 == 0) b /= 2;else 	b = (3 * b + 1) / 2;a[b] = 2;}}for(int i = 0 ; i < 10000; i ++) {if(a[i] == 1) sum ++;//放在外面的sum// }for(int i = 10000; i >= 0 ; i --) {if(a[i] == 1) {printf("%d" , i);sum--;if(sum > 0) printf(" ");	//再次注意这个写法。//}} return 0;
}

 

1006:换个格式输出整数 (15)(完成)

注意要点:

1. 新C++中不再支持gets,需要换回C了。

#include<stdio.h>char s[10];int main(){int len;gets(s);len=strlen(s);if(len==1){for(int i=1;i<=(s[0]-'0');i++){printf("%d",i);}}if(len==2){for(int i=1;i<=(s[0]-'0');i++){printf("S");}for(int i=1;i<=(s[1]-'0');i++){printf("%d",i);}}if(len==3){for(int i=1;i<=(s[0]-'0');i++){printf("B");}for(int i=1;i<=(s[1]-'0');i++){printf("S");}for(int i=1;i<=(s[2]-'0');i++){printf("%d",i);}}return 0;
}

 

1007: 素数对猜想 (20)(完成)

注意要点:

1.埃氏筛法的写法。

2.在一开始定义的时候最好都能定义成一致的。

#include<iostream>
using namespace std;int a[100005],primeNum=0;
bool flag[100005]={0};//素数技巧:埃氏筛法//
void prime(int c){	for(int i=2;i<=c;i++){if(flag[i]==0){  a[primeNum++]=i;for(int j=i+i;j<=c;j+=i){flag[j]=1;}}}
}int main(){int n,ans=0;scanf("%d",&n);prime(n);for(int i=0;i<primeNum;i++)if(a[i+1]-a[i]==2)ans++;printf("%d",ans);return 0;
}

 

1008:数组元素循环右移问题 (20)

注意要点:

1.什么鬼,这个题目真的佛了,这个点100%想不到。比如说 ,我左移九位,其实等于转了一圈,只是往左移了一位。

#include<iostream>
using namespace std;int main(){int n , m;int a[105] = {0};scanf("%d%d" , &n , &m);m = m % n;//这个是在等比例缩小// for(int i = 0 ; i < n ; i ++) {scanf("%d" , &a[i]);}for(int i = n - m ; i < n ; i ++) {printf("%d " , a[i]);}for(int i = 0 ; i < n - m ; i ++) {if(i == n - m - 1) printf("%d" , a[i]);else printf("%d " , a[i]);}return 0;
}

 

1009:说反话 (20)(完成)

注意要点:

1.在EOF下需要手动更新数值。ctrl+z

#include<iostream>
using namespace std;
//利用字符串数组解决问题。//
int main(){char s[85][85];int i=0;while(scanf("%s",s[i])!=EOF){i++;}int n=i;for( i=n-1;i>=0;i--){if(i<n-1){printf(" ");}printf("%s",s[i]);}return 0;
}

 

1010:一元多项式求导 (25) (AC)

注意要点:

1.行末没有空格这种要求怎么办?可以设置一个计数器先--,判断这个值只要不是0,就输出一个空格。

2.注意数组空间。但凡涉及到两个数字的关系的时候,考虑数组。

 3.还要注意EOF的用法。同时此题目也可用=2来做。

#include<iostream>
using namespace std;
int main() {int a[10005] = { 0 }; int n1 , n2, count = 0;while(scanf("%d%d" , &n1 , &n2) != EOF) {a[n2] = n1; }a[0] = 0;for(int i = 1 ; i <= 1000 ; i ++) {//空间报错// a[i-1] = a[i] * i ;a[i] = 0 ;//更新完后的数值必须舍弃,否则倒着输出会有问题出现// if(a[i - 1] != 0)	count ++;}if(count == 0)	printf("0 0");else {for(int i = 1000 ; i >=0 ; i --) {if(a[i] != 0) {printf("%d %d" , a[i] , i);count --; if(count != 0)	printf(" ");//行末没有多余的空格的标准写法// }}}return 0;
} 

 

1013:数素数 (20)  (完成)

注意要点:

1. 还有一个地方没有改对。不知道为什么。(这就是一个打表,注意输出的问题。)

#include<iostream>
using namespace std;const int maxn=10005;
int prime[maxn],pNum=1;
bool p[maxn]={0};void Find_prime(int b){for(int i=2;i<maxn;i++){if(p[i]==false){prime[pNum++]=i;for(int j=i+i;j<maxn;j+=i){p[j]=true;}}}
}
int main(){int a,b,i=1;scanf("%d%d",&a,&b);Find_prime(b);for( ;a<=b;a++){if(i%10==1) printf("%d",prime[a]);else        printf(" %d",prime[a]);if(i==10) {printf("n");i=1;continue;}i++;}return 0;
}

修正之后的版本:有几个地方擅自修改了,结果答案错了。一脸懵逼。

#include<iostream>
using namespace std;const int maxn=1000005;
int prime[maxn],pNum=0;
bool p[maxn]={0};void Find_prime(int b){for(int i=2;i<maxn;i++){if(p[i]==false){prime[pNum++]=i;if(pNum>=b) break; for(int j=i+i;j<maxn;j+=i){p[j]=true;}}}
}
int main(){int a,b,i=0;scanf("%d%d",&a,&b);Find_prime(b);for(int k=a;k<=b;k++){//这些地方能不要省就不要省,容易错// printf("%d",prime[k-1]);i++;if(i%10!=0 && k<b)	printf(" ");else printf("n");}return 0;
}

 

1017:A除以B (20)(20 分)(完成)

注意要点:

1.大数计算。注意三板斧,前两板斧都是套路,最后一板斧变化一下即可。

#include<iostream>
#include<cstring>
using namespace std;int r=0;struct bign{int d[1000];int len;bign(){len=0;memset(d,0,sizeof(d));}
};bign change(char c[]){bign a;a.len = strlen(c);for(int i=0;i<a.len;i++){a.d[i]=c[a.len-i-1]-'0';}return a;
}bign divide(bign A,int b,int &r){bign ans;ans.len = A.len;for(int i=A.len-1;i>=0;i--){r = r * 10 +A.d[i];if(r<b) ans.d[i]=0;else{ans.d[i]= r/b;r = r % b;}}while(ans.len-1>=1 && ans.d[ans.len-1]==0){ans.len--;}return ans;
}void print(bign ans,int &r){for(int i = ans.len-1;i>=0;i--){printf("%d",ans.d[i]);}printf(" %d",r);
}
int main(){char a[1005];int b;scanf("%s%d",a,&b);bign A = change(a);bign C = divide(A,b,r);print(C,r);return 0;
}

 

1019:数字黑洞(20 分)(AC)

注意要点:

1.这个题的思路不是很难,注意sort的写法就行。

#include<iostream>
#include<algorithm>
using namespace std;int a[5] = { 0 };bool cmp(int a , int b) {return a > b ; 
} //cmp的基础用法//void isarray(int N ) {for(int i = 0 ; i < 4 ; i ++) {a[i] = N % 10;N /= 10;}
}int isnumber(int A[]) {int sum = 0;for(int i = 0 ; i < 4 ; i ++) {sum = sum * 10 + a[i];}return sum;
}int main() {int N , min , max;scanf("%d" , &N);while(1) { //这个循环的条件要注意//isarray(N);sort(a , a + 4);min = isnumber(a);//最小值// sort(a , a + 4 , cmp);max = isnumber(a); //最大值//N = max - min ; printf("%04d - %04d = %04dn" , max , min , N);if(N == 0 || N == 6174) break; }return 0;
}

 

1021:个位数统计 (15)   (完成)

#include<iostream>
using namespace std;int main(){char s[10000];int a[10]={0},i=0;while(scanf("%c",&s[i])==1){a[s[i]-'0']++;i++;}for(int i=0;i<=9;i++){if(a[i]!=0)printf("%d:%dn",i,a[i]);}return 0;
}

 

1022:D进制的A+B (20)(20 分)(完成)

注意要点:

1.这个题是典型的进制转换题型,对于P进制转换Q进制,中间加一个10进制作为转换的接口。

2.所谓的除基取余法,其实就是手动模拟除法。

#include<iostream>
using namespace std;
int main(){int e,b,c,sum,a[40] ,num = 0;;scanf("%d%d%d",&e,&b,&c);sum = e + b ;do{a[num++] = sum % c ;sum /= c ;} while(sum != 0);for(int i=num-1;i>=0;i--){printf("%d",a[i]);}return 0;
}

 

1023:组个最小数 (20)(20 分)(完成)

注意要点:

1.有思路->按照思路写代码。

#include<iostream>
using namespace std;
int a[10]={0};
int main(){for(int i=0;i<10;i++){scanf("%d",&a[i]);}for(int i=1;i<10;i++){if(a[i]!=0){printf("%d",i),a[i]-=1;break;}}for(int i=0;i<10;i++){if(a[i]!=0){for(int j=0;j<a[i];j++){printf("%d",i);}}}return 0;
}

 

1026:程序运行时间(15) (AC)

注意要点:

1.怎么写四舍五入?只能是手动判断,当这个数值大于100 的一半的时候,我们就能这样做。

#include<iostream>
using namespace std;int main(){int a , b , c;scanf("%d%d" , &a , &b);int m = b - a ; if(m %100 >= 50)    //手动四舍五入//c = (b - a) / 100 + 1;else	c = (b - a) / 100;printf("%02d:%02d:%02d" , c / 3600 , (c % 3600) / 60 , c % 60);return 0;
}

 

1029:旧键盘(20)(20 分)(AC)

注意要点:

1.第一次接触到Hash思想,以后可以多注意。

2.注意分析问题的时候,在脑子里面自己要考虑清楚会发生什么样子的情况。

3.Hash + 动态更新。

#include<iostream>
#include<cstring>
using namespace std;int main(){char a[85],c[85];int b[100000] = { 0 };scanf("%s" , a);int len1 = strlen(a);for(int  i = 0 ; i < len1 ; i ++) {if(a[i] >= 'a' && a[i] <= 'z') {a[i] = a[i] - 32 ;b[a[i] - '0'] = 1;}else	b[a[i]-'0'] = 1 ;}getchar();scanf("%s" , c);int len2 = strlen(c); for(int i = 0 ; i < len2 ; i ++) { if(c[i] >= 'a' && c[i] <= 'z') {c[i] = c[i] - 32 ;b[c[i] - '0']= 2;}else	b[c[i]-'0'] = 2 ;}for(int  i = 0; i < len1 ; i ++) {if(b[a[i]-'0'] == 1) {printf("%c" , a[i]);b[a[i]-'0'] = 0;}}return 0;
}

 

1031:查验身份证(15)(AC)

注意要点:

1.再次说明思路的问题。做题之前必须有一个合理的思路,这样可以提高很大的正确率。

2.注意你每一行的写法,一个小的错误都会是致命的。

3.全对输出这个怎么做?直接设置一个flag放进去等就行了。前提是flag不是一个判断条件。

4.非数字的写法判断。

#include<iostream>
#include<cstring>
using namespace std;
int main() {int N;scanf("%d" , &N);char s[19];char M[15] = {'1' , '0' , 'X' , '9' , '8' , '7' , '6' , '5'  , '4' , '3' , '2'};int w[20] = {7 , 9 , 10 , 5 , 8 , 4 , 2 , 1 , 6 , 3 , 7 , 9 , 10 , 5 , 8 , 4 , 2}; bool flag = true; for(int i = 0 ; i < N ; i ++) {int sum = 0;scanf("%s" , s);getchar();int j;for( j = 0 ; j < 17 ; j ++) {if(! (s[j] >= '0' && s[j] <= '9'))//看好这个非数字的写法// break;sum += (s[j] -'0') * w[j];}//当不够的时候,说明里面有字母// if(j < 17) {flag = false;printf("%sn" , s); }//验证不对,输出// else {if(M[sum % 11] != s[17]){flag = false;printf("%sn" , s);}}}//如果全对的时候,设置一个外变量,看其是否变化.// if(flag == true){printf("All passed");}return 0;
}

 

1032:挖掘机技术哪家强(20)(20 分)(完成)

注意要点:

1.输入。

#include<iostream>
using namespace std;
int main(){int a[100005]={0};int n,max=0,k,num,score;scanf("%d",&n);for(int i=1;i<=n;i++){//scanf("%d %d",&c,&a[c]);这样写有点问题//scanf("%d%d",&num,&score);a[num]+=score;}for(int i=1;i<=n;i++){if(max<=a[i]) {max = a[i];k=i;}}printf("%d %d",k,max);return 0;
}

 

1033 :旧键盘打字(20 分)(WA)

还未完成,13分,三个未通过。

#include<iostream>
#include<cstring>
using namespace std;int main(){char a[100005] , b[100005];int c[300] = { 0 };int G = 0;scanf("%s" , a);int len1 = strlen(a);for(int i = 0 ; i < len1 ; i ++) {if(a[i] == '+'){G = 1;}c[a[i] - '0'] = 1;if(a[i] >= 'A' && a[i] <= 'Z'){a[i] = a[i] + 32;c[a[i]-'0'] = 1;	}}getchar();scanf("%s" , b);int len2 = strlen(b);for(int i = 0 ; i <len2 ; i++) {if(G == 1) {if(b[i] >= 'A' && b[i] <= 'Z') {c[b[i] - '0'] = 1;}}}for(int i = 0 ; i <len2 ; i ++) {if(c[b[i] - '0'] == 0)printf("%c" , b[i]); }return 0;
}

 

1036:跟奥巴马一起编程(15)(15 分)(完成)

注意要点:

1.除(÷)这个符号会直接截取。

#include<iostream>
using namespace std;
int main(){int n,b;char a;scanf("%d %c",&n,&a);if(n%2==0)	b=n/2;else	b=n/2+1;for(int i=1;i<=b;i++){for(int j=1;j<=n;j++){if(i==1 || i==b || j==1 || j==n)    printf("%c",a);else                                    printf(" ");if(j==n)		printf("n");}}return 0;
}

 

1037:在霍格沃茨找零钱(20 分)(AC)

注意要点:

1.认真考虑进制转换的那个地方。

#include<iostream>
using namespace std;int main() {int G1 , S1 , K1 , G2 , S2 , K2;scanf("%d.%d.%d %d.%d.%d" , &G1 , &S1 , &K1 , &G2 , &S2 , &K2);int P  = 17 * 29 * G1 + 29 * S1 + K1;int A  = 17 * 29 * G2 + 29 * S2 + K2;	 	if(P <= A) {printf("%d.%d.%d" , (A - P) / (29 * 17) , ((A - P) % (29 * 17)) / 29 , (A - P) % (29 * 17) % 29 );}else	printf("-%d.%d.%d" , (P - A) / (29 * 17) , ((P - A) % (29 * 17)) / 29 , (P - A) % (29 * 17) % 29 );return 0;
} 	

 

1038:统计同成绩学生(20)(20 分)(AC)

注意要点:

1.行末不得有空格的写法。

#include<iostream>
using namespace std;int main() {int grade[105] = { 0 };int find[100005] = { 0 };int N , a , n , b; scanf("%d" , &N);for(int i = 0 ; i < N ; i ++) {scanf("%d" , &a);grade[a] ++;}scanf("%d" , &n);for(int i = 0 ; i < n ; i++) {scanf("%d" , &find[i]);} for(int i = 0 ; i < n ; i++) {if(i == n - 1) {	printf("%d" , grade[find[i]]);	break;}printf("%d " , grade[find[i]]);} return 0;
} 	

 

1039:到底买不买(20)(AC)

注意要点:

1.转换HashTable下标这个地方需要注意。搞清楚问什么它会这么做,不只是将这个变成ASCII码数值。

2.这个地方只是让求 miss 个数,所以没有必要去搞什么循环。

#include<iostream>
#include<cstring>
using namespace std;int change(char a) {if(a >= '0' && a <= '9')	return a - '0';if(a >= 'a' && a <= 'z')	return a - 'a' + 10;if(a >= 'A' && a <= 'Z')	return a -'A' + 36;	
}int main() {int miss = 0 ;int HashTable[200] ={0}; char s1[1005] , s2[1005];int sum = 0 ;scanf("%s" , s1);int len = strlen(s1);for(int i = 0 ; i < len ; i ++) {HashTable[change(s1[i])] ++; }getchar();scanf("%s" , s2);int len2 = strlen(s2);for(int i = 0 ; i < len2 ; i ++) {HashTable[change(s2[i])] --;if(	HashTable[change(s2[i])] < 0)miss ++;	}if(miss > 0) //第一串中没有第二串的材料//printf("No %d" , miss);else printf("Yes %d" , len - len2);return 0;
} 

 

1040:有几个PAT(25)(AC)

注意要点:

1.这个题的思路很巧妙。利用PAT三个数之间的关系来解决问题。

2.可以看一看为什么需要取余1000000007。

#include<iostream>
#include<cstring>
using namespace std;
int main(){char s[100005];scanf("%s",s);int len = strlen(s),t=0,p=0,sum=0;for(int i=0;i<len;i++){if(s[i]=='T'){t++;}}for(int i=0;i<len;i++){if(s[i]=='T') t--;if(s[i]=='P') p++;if(s[i]=='A') sum=(sum+(t*p)%1000000007)%1000000007;//有点问题。//}printf("%d",sum);return 0;
}

 

1041:考试座位号(15 分)(AC)

注意要点:

1.结构体问题。怪不得上次天梯赛的那个题目会是那个样子,原来如此。using namespace std 会出现撞车的情况报错,显示已经定义过。redeclared as different kind of symbol。

#include<iostream>
using namespace std;//撞车//struct Std{char s[20];int a ;int b ;
}sd[1005];//这个地方写成会与上面撞车。//int main() {int N , M;int P[1005] = {0};scanf("%d" , &N);for(int i = 0 ; i < N ; i ++) {scanf("%s %d %d" , sd[i].s , &sd[i].a , &sd[i].b);} getchar();scanf("%d" , &M);for(int  i = 0 ; i < M ; i ++) {scanf("%d" , &P[i]);}for(int i = 0 ; i < M ; i ++) {for(int j = 0 ; j < N ;j ++) {if(P[i] == sd[j].a)printf("%s %dn", sd[j].s , sd[j].b);}}return 0;
}

 

1042:字符统计(20 分)(AC)

注意要点:

1.按照最小的怎么来?去掉等于号就可以了。

#include<iostream>
using namespace std;
int main() {char a , d;int max = -10000;int b[30] = { 0 };while(scanf("%c" , &a) == 1) {if(a >= 'a' && a <= 'z' ) b[a - 'a'] ++;if(a >= 'A' && a <= 'Z')b[a - 'A'] ++;}for(int i = 0 ; i < 27 ; i ++) {if(b[i] > max) {max = b[i] ;d = i;}}printf("%c %d" , d + 'a' , max); return 0;
}

 

1043:输出PATest(20 分)(AC)

注意要点:

1.while scanf写法注意符号“&”的控制。

2.这个输出的思路很精妙。

3.平行Hash技巧。可以省去很多的麻烦。

#include<iostream>
using namespace std;
int main() {char a , b[6] = {'P' , 'A' , 'T' , 'e' , 's' , 't'};int c[6] = { 0 };int sum = 0;while(scanf("%c" , &a) == 1) {for(int  i = 0 ; i < 6 ; i ++) {if(a == b[i]) {c[i] ++;sum ++;} }}while(sum > 0) {for(int i = 0 ; i < 6 ; i ++) {if(c[i] > 0) {printf("%c" , b[i]);c[i] --;sum --;}}}return 0;
}

 

1045:Quick Sort(25 分)(AC)

注意要点:

1.思路很清晰,但是这个地方可以利用这个小技巧,因为你每次前面的数据就是这个这个最小值了,所以完全没有必要每次都去遍历前面的数据,直接可以与上一个数据进行比较就行。

2.本题目和QS完全没有任何关系,倒像是在给你介绍QS的原理。

2.这个地方注意有个坑,最后需要输出一个回车。我其实很费解这个东西。以后建议所有的题目之后都去写一个回车以防万一。

#include<iostream>
#include<algorithm>
using namespace std;
const int INF = 1000000000;
int main() {int N , sum = 0;int a[100005] = {0};int leftmax[100005] = {0};int rightmin[100005] = {0};//input// scanf("%d" , &N);leftmax[0] = 0;rightmin[N - 1] = INF;for(int i = 0 ; i < N ; i ++) {scanf("%d" , &a[i]);}//leftmax:可修正,其实完全不必每次都把数据遍历一次//for(int i = 1 ; i < N ; i ++) {leftmax[i] = max(leftmax[i - 1] , a[i - 1]);}//rightmin,这个地方你想,如果要是N - 1 的话,N - 1 + 1 不就翻出数组外头去了。。//for(int i = N - 2; i >= 0 ; i --) {rightmin[i] = min(rightmin[i + 1] , a[i + 1]);}//statistic// for(int i = 0 ; i < N ; i ++) {if(a[i] > leftmax[i] && a[i] < rightmin[i]) {sum ++;}}//output//printf("%dn" , sum);for(int i = 0 ; i < N ; i ++) {if(a[i] > leftmax[i] && a[i] < rightmin[i]) {printf("%d" , a[i]);sum--;if(sum != 0) printf(" ");}}printf("n");//无厘头的要求。// return 0;
} 

1046:划拳(15 分)(AC)

水题没啥说的。

#include<iostream>
using namespace std;int main(){int N , x = 0, y = 0;scanf("%d" , &N);for(int i = 0 ; i < N ; i ++) {int s[4] = {0};for(int j = 0 ; j < 4 ; j ++ ) {scanf("%d" , &s[j]);}//如果两个人都赢了,或者都输了 ,下一轮// if(s[0] + s[2] == s[1] && s[0] + s[2] == s[3]) continue;if(s[0] + s[2] != s[1] && s[0] + s[2] != s[3]) continue; //甲赢了 乙喝酒// if(s[0] + s[2] == s[1])	x ++;//乙赢了 甲喝酒// if(s[0] + s[2] == s[3])	y ++;}printf("%d %d" , y , x);return 0;
}

 

1047:编程团体赛(20 分)

注意要点:

1.注意题目给的范围,在此基础之上增加一点即可,但是注意一定要大。(+ 5即可。)

#include<iostream>
using namespace std;
int main() {int N;int grade[1005] = { 0 };//注意范围大小//int max1 = -10000 , max2 = -1000;int x , y, z;scanf("%d" , &N);while(N --) {scanf("%d-%d %d" , &x , &y , &z);grade[x] += z ;if(grade[x] > max1) {max1 = grade[x];max2 = x; } }printf("%d %d" , max2 , max1);return 0;
}

 

1052:卖个萌(20 分)(AC)(01:21:33)

注意要点:

1.AC了两次老是报错,后来才发现是根本写不出来这几个字符。

2.更加高级一点的 string 用法。加深了一遍印象。

3.注意出现的转义字符的用法。

#include<iostream>
#include<cstring> 
using namespace std;int get(string a , string b[]) {int k = 0 ;for(int i = 0 ; i < a.size() ; i ++) {if(a[i] != '[' && a[i] != ']' && a[i] != ' ') {b[k] += a[i];//这一步是为什么?// }if(a[i] == ']')k ++;}return k;
}string s[3];//这个地方是三个string.// 
string shou[15] , yan[15] , kou[15];
int main() {for(int i = 0 ; i < 3 ; i ++) {getline(cin , s[i]);}int len1 = get(s[0] , shou);int len2 = get(s[1] , yan);int len3 = get(s[2] , kou);int N ; scanf("%d" , &N);for(int i = 0 ; i < N ; i ++) {int face [5] = { 0 };for(int j = 0 ; j < 5 ; j ++) {cin >> face[j] ; }if(face[0]> len1 || face[1] >len2 || face[2] > len3 || face[3] > len2 || face[4] > len1 || face[0] <= 0 || face[1] <= 0 || face[2] <= 0 || face[3] <= 0 || face[4] <= 0) {cout << "Are you kidding me? @\/@" << endl;//这个地方的转义字符// }else {cout << shou[face[0] - 1] << "(" << yan[face[1] - 1] << kou[face[2] - 1] << yan[face[3] - 1] << ")" << shou[face[4] - 1] << endl;}}return 0;
} 

 

1056:组合数的和(15 分)(AC)

注意要点:

无。

#include<iostream>
using namespace std;
int main() {int N;int sum = 0;int a[15] = { 0 };scanf("%d" , &N);for(int i = 0 ; i < N ; i ++) {scanf("%d" , &a[i]);}for(int i = 0 ; i < N ; i ++) {for(int j = 0 ; j < N ; j ++) {if(i != j) sum += a[i]*10 + a[j];}}printf("%d" , sum);return 0;
} 

 

1057:数零壹(20 分)(AC)

注意要点:

1.注意那个判断二进制的问题。do while 不行的原因就是它会先做,所以需要用while。

#include<iostream>
#include<cstring>
using namespace std;int m = 0 , n = 0;int main() {int sum = 0; char a;while(scanf("%c" , &a) == 1){if(a >= 'A' && a <= 'Z') {sum += (a - 'A' + 1) ;}if(a >= 'a' && a <= 'z'){sum += (a - 'a' + 1);}} while(sum != 0) {if(sum % 2 == 0) m ++;else	n ++;sum = sum / 2;}printf("%d %d" , m , n);return 0;
} 

 

1059:C语言竞赛(20 分)(AC)

注意要点:

1.送巧克力的记得也别再要了。

#include<iostream>
using namespace std;int isprime(int i) {if(i <= 0) return false;for(int j = 2 ; j * j <= i ; j ++){if(i % j == 0) return false;}return true;
}int main() {int M , N , d;int name[10005] = {0};int judge[10005] = {0}; scanf("%d" , &M);for(int i = 1 ; i <= M ; i ++) {scanf("%d" , &name[i]);judge[name[i]] = i;}scanf("%d" , &N);for(int i = 1 ; i <= N ; i ++) {scanf("%d" , &d);if(judge[d] == 1){printf("%04d: Mystery Awardn" , d);judge[d] = -1;}//神秘大奖// else if(isprime(judge[d]) == 1) {printf("%04d: Minionn" , d);judge[d] = -1;}//小黄人//else if(judge[d] == -1){printf("%04d: Checkedn" , d); } //已经领过// else if(judge[d] == 0) {printf("%04d: Are you kidding?n" , d);}//没参与// else {printf("%04d: Chocolaten" , d);//巧克力// 	judge[d] = -1;                   //#少加一个判断//}}return 0;
} 

 

1060:爱丁顿数(25 分)(AC)

注意要点:

1.sort 的用法出现了,cmp1。

#include<iostream>
#include<algorithm>
using namespace std;bool cmp1(int a , int b) {return a > b;
}int main() {int N , i;int a[100000] ;scanf("%d" , &N);for(int i = 1 ; i <= N ; i ++) {scanf("%d" , &a[i]);} sort(a + 1 , a + N + 1, cmp1);i = 1;int count =0 ;while( i <= N && a[i] > i) {i++;count++;}printf("%d" , count);return 0;
}

 

1061:判断题(15 分)

注意要点:一行写完之后,不能有语法错误。快准狠。

#include<iostream>
using namespace std;
int main() {int M , N;int c , sum = 0;int a[100] = { 0 };int b[100] = { 0 };scanf("%d %d" , &M , &N);for(int i = 0 ; i < N ; i ++) {scanf("%d" , &a[i]);}for(int i = 0 ; i < N ; i ++) {scanf("%d" , &b[i]);} for(int i = 0 ; i < M ; i ++) {for(int j = 0 ; j < N ; j ++) {scanf("%d" , &c);if(c == b[j]) {sum += a[j];}}printf("%dn" , sum);sum = 0;} return 0;
} 

 

1062:最简分数(20 分)

注意要点:

1.辗转相除法的使用。

2.强调思路的重要性。先写主函数,主函数框架思路搭好,补充其他函数就行。

3.题目,每个题目每句话必有用。两个数字大小还能不一样,真的服了。

#include<iostream>
using namespace std;int gcd(int a , int b) {if(b == 0) return a;else gcd(b , a % b);
}int lcm (int b , int d , int e) {int f , h;f = gcd(b , d);f = b / f * d;h = gcd(f , e);h = f / h * e;	return h; 
}
int main() {//先找最小公倍数//int a , b , c , d , e;int count = 0;int g[1005] = {0} ;scanf("%d/%d %d/%d %d" , &a , &b , &c , &d , &e);int f = lcm(b , d , e);// 变换分子//a = f / b * a ;c = f / d * c ;//踩坑点:有可能两个正分数大小不等//if(a > c){int temp = a; a = c; c = temp;temp = b; b = d; d = temp; } //分子分母变换,余数不为 0 则输出// for(int i = a + 1 ; i < c ; i ++) {if(f % e == 0){if(i % (f / e) == 0 && gcd(i / (f / e) , e) == 1) {g[count ++] = i / (f / e);}}}for(int i = 0 ; i < count ; i ++) {if(i == count - 1) {printf("%d/%d" , g[i] , e);break;}printf("%d/%d " , g[i] , e);}return 0;
}

 

1063:计算谱半径(20 分)(AC)

注意要点:

1.注意开方函数 sqrt, 没了。

2.此题有一个疑点尚未解决,那就是四舍五入的问题。

#include<iostream>
#include<math.h>
using namespace std;double fun(int a , int b) {return sqrt(a * a + b * b);//注意四舍五入和开方用法// 
}
int main() {int N , a , b;double max = -1000.0;scanf("%d" , &N);for(int i = 0 ; i < N ; i ++) {scanf("%d%d" , &a , &b);if(fun(a , b) > max) {max = fun(a , b);}}printf("%.2f" , max); return 0;
} 

 

1064:朋友数(20 分)(AC)

注意要点

1.注意看输出的内容。

#include<iostream>
#include<cstring>
using namespace std;
int main() {int N , sum = 0 , count = 0;int d[100] = { 0 };scanf("%d" , &N);for(int i = 0 ; i < N ; i ++) {char a[1005];scanf("%s" , a); int len = strlen(a);for(int j = 0 ; j < len ; j ++) {sum += (a[j] - '0');}d[sum] = 1 ;sum = 0; }for(int i = 0 ; i < 99 ; i ++) {if(d[i] == 1) count ++;}printf("%dn" , count);for(int i = 0 ; i < 99 ; i ++) {if(d[i] == 1) {printf("%d" , i );count--;if(count != 0)printf(" ");}}return 0; 
}

 

1065:单身狗(25 分)(AC)

注意要点:

1.呵呵,这个题目真的侥幸,没有让输出 00000,要不然拿不了满分。

2.注意补齐0的写法:在输出的前面写上,%05d。0代表占位格,5代表个数。

#include<iostream>
using namespace std;
int main() {int N , d , e ,count = 0;int a[100005] = { 0 }, c[100005] = { 0 };//输入//scanf("%d" , &N);for(int i = 0 ; i < N ; i ++) {scanf("%05d%05d" , &d , &e);a[d] = 1;a[e] = 1;c[d] = e;c[e] = d;}scanf("%d" , &N);for(int i = 0 ; i < N ; i ++) {scanf("%05d" , &d);a[d] = 2;}//数数值//for(int i = 0 ; i < 100005 ; i ++) {if(a[i] == 2)	count ++;}//判断条件是否成立//for(int i = 0 ; i < 100005 ; i ++) {if(a[i] == 2 && a[c[i]] == 2) {a[i] = 1;a[c[i]] = 1;count -= 2;}	}//输出//printf("%dn" , count);for(int i = 0 ; i < 100005 ; i ++) {if(a[i] == 2) {printf("%05d" , i);count -- ;if(count != 0) printf(" "); }}return 0;
}

 

1066:图像过滤(15 分)(AC)

注意要点:

1.注意数组开辟的时候的定义。

#include<iostream>
using namespace std;
int main() {int M , N , A , B , h;int d[505][505] = { 0 };//注意//scanf("%d%d%d%d%d" , &M , &N , &A , &B , &h);for(int i = 0 ; i < M ; i ++) {for(int j = 0 ; j < N ; j ++) {scanf("%d" , &d[i][j]);if(A <= d[i][j] && d[i][j] <= B) {d[i][j] = h;}}}for(int i = 0 ; i < M ; i ++) {for(int j = 0 ; j < N ; j ++) {if(j == N - 1)printf("%03dn" , d[i][j]);elseprintf("%03d " , d[i][j]);}} return 0;
} 

 

1067:试密码(20 分)(AC)

注意要点:

1.首次使用getline放在循环里使用。getline现在还不会对string类进行操作,会了的话可以代替 %s 了。

#include<iostream>
#include<cstring>
using namespace std;
int main() {string a , b;int N , c = 0 , sum = 0;cin >>a>>N;  getchar();while(getline(cin , b)) {if(b == "#")	break;if(a != b && c != 1){cout<<"Wrong password: "<<b<<endl;sum ++;	}else c = 1;	}if(sum == N){printf("Account lockedn");}if(c == 1 && sum != N) {printf("Welcome inn");}return 0;
} 


1076:Wifi密码(15 分)(AC)

注意要点:

1.map的头文件是 #include <map> ,仅仅只是演示了一下map 的用法。其实就是映射(数组),没有什么。

#include<iostream>
#include<map>
using namespace std;
int main(){map<char , int>a;a['A'] = 1;a['B'] = 2;a['C'] = 3;a['D'] = 4;int N;char c , b;int print[105] = { 0 };scanf("%d",&N);getchar();for(int i = 1; i <= N; i ++) {for(int j = 1; j <= 4; j ++) {scanf( "%c-%c" , &c , &b);getchar();if( b == 'T')print[i] = a[c];}}for( int i = 1;i <= N ; i++) {printf( "%d" , print[i]);}return 0;
} 

 

1078:字符串压缩与解压(20 分)(AC)

注意要点:

2.这个题目分成两种形态做比较舒服。各管各的,不需要多操心。

#include<iostream>
#include<cstring>
using namespace std;string a;void fun1(){getline(cin,a);for(int i = 0; i <a.length() ; i ++){int num = 0;while(a[i]==a[i+1]){i++;num++;}if(num != 0){printf("%d" , num+1);}printf("%c" , a[i]);}
}void fun2(){getline(cin , a) ;for(int i=0 ; i < a.length() ; i ++){int sum = 0 ;while( a[i] >= '0' && a[i] <= '9'){sum = sum * 10 + (a[i ++] - '0') ;}for(int j = 0 ; j < sum ; j++){printf("%c" , a[i]) ; } if(sum == 0){printf("%c" , a[i]);} }
}int main(){char N;scanf("%c" , &N);getchar();if(N=='C')	fun1();else    	fun2();printf("n");return 0;
} 

 

1081:检查密码(15 分)(已完成)

注意要点:

1.小心为空,这次之后%s可能会换成getline了。

2.如何查找一个字符串中是否没有一个东西?答:设置一个标记。定义的时候记得放在循环里面。

#include<iostream>
#include<cstring>
using namespace std;
int main(){int N;int m1 = 0,m2 = 0,m4 = 0;string a;scanf("%d", &N);getchar();while(N --) {int m1 = 0,m2 = 0,m4 = 0;getline(cin,a);int s = a.length();//密码太短 if(s < 6) {printf("Your password is tai duan le.n");continue;} for(int i = 0; i < s; i ++){if(a[i] >= '0'&& a[i] <= '9')	m1 = 1; else if(a[i] >= 'a' && a[i] <='z')	m2 = 1;else if(a[i] >= 'A' && a[i] <='Z')	m2 = 1;else if(a[i] == '.')	; else m4 = 1;} if(m2 == 0)	{printf("Your password needs zi mu.n");continue;}if(m1 == 0)	{printf("Your password needs shu zi.n");continue;}if(m4 == 1)	{printf("Your password is tai luan le.n");continue;}//密码合法 printf("Your password is wan mei.n");} return 0;
}

 

1082:射击比赛(20 分)(已完成)

注意要点:

1.复习结构体。上次踩过的坑不要再踩一次。

2.string 和 char 字符串不是一个概念,不能混用,且string.h下的函数也不能使用。

3.复习结构体的strcpy函数。

#include<iostream>
#include<cstring>
using namespace std;struct per{char id[1005];int x;int y;
}P;int main() {int N;char idmax[1000],idmin[1005];scanf("%d" , &N);int max = -10000 , min = 10000;while(N --) {scanf("%s" , P.id); getchar();scanf("%d%d" , &P.x , &P.y);if(P.x * P.x + P.y * P.y >= max) {max = P.x * P.x + P.y * P.y;strcpy(idmax , P.id); }if(P.x * P.x + P.y * P.y <= min) {min = P.x * P.x + P.y * P.y;strcpy(idmin , P.id); }}printf("%s %s" , idmin , idmax);return 0;  
}

 

1083:是否存在相等的差(20 分)(已完成,需要补充函数)

注意要点:

1.小心0的情况。这些特殊的观察点一定要注意到,否则不容易想出。

2.针对函数可以在优化,我是不太了解algorithm下的函数变化,随后补充函数abs等等。

#include<iostream>
using namespace std;int absa(int a, int b) {if(a >= b)	return a - b ;else	return b - a ;
}int main() {int N , n;int count[10005] = { 0 }; scanf("%d" , &N);for(int i = 1; i <= N ; i ++) {scanf("%d" , &n);count[absa(n , i)] ++;}for(int i = N ; i >= 0 ; i --){if(count[i] != 0 && count [i] >= 2) {printf("%d %dn" , i , count[i]);}}return 0;
} 

 

1091:N-自守数 (15 分)(AC)

这次之后,感觉风格更偏向函数化编程了。

#include<iostream>
#include<vector>
using namespace std;int sum_s(int a){int s = 0;while(a > 0){s ++;a /= 10;}return s;
}bool ans(int a , int j){vector<int> v;int answer = j * a * a;while(answer > 0){v.push_back(answer % 10);answer /= 10;	}int s = sum_s(a);if(s == 1 && v[0] == a){return true;}else if(v[1] * 10 + v[0] == a && s == 2){return true;}else if(s == 3 && v[2] * 100 + v[1] * 10 + v[0] == a){return true;}else if(s == 4 && v[3] * 1000 + v[2] * 100 + v[1] * 10 + v[0] == a){return true;}else{return false;}	
}int main(){int M , num[25];scanf("%d" , &M);for(int i = 0 ; i < M ; i ++){scanf("%d" , &num[i]);}for(int i = 0 ; i < M ; i ++){bool flag = false;for(int j = 1 ; j < 10 ; j ++){if(ans(num[i] , j) == true){printf("%d %dn" , j , j * num[i] * num[i]);flag = true;break;}}if(flag == false){printf("Non");}}return 0;
}

 

1093 字符串A+B (20 分)

注意要点:

1.对于string类型的可以直接使用循环,而且用法类似于char类型,除了不能使用printf()以外。

#include<iostream>
#include<string.h>
using namespace std;bool judge[150] = {false};void print(string a){for(int i = 0 ; i < a.length() ; i ++){if(judge[a[i] - '0'] == false){cout << a[i];judge[a[i] - '0'] = true;}}
}int main(){string a , b;getline(cin , a);getline(cin , b);print(a);print(b);return 0;
}

 

本文发布于:2024-01-28 14:05:31,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064219367951.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:Basic   PAT   Practice   Level
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23