PAT乙级真题

1002

#include<stdio.h>
#include<string.h>
int main(){
	int cha = '1' - 1;
	int he = 0;
	char n[200];
	scanf("%s",&n);
	for(int i = 0;i < strlen(n);i++){
		he += n[i] -cha;}
	char zhuan[10];
	sprintf(zhuan,"%d",he);

	for(int i_1 =0;i_1<strlen(zhuan);i_1++){
		switch(zhuan[i_1]){
		case '0':printf("ling");break;
		case '1':printf("yi");break;		
		case '2':printf("er");break;
		case '3':printf("san");break;
		case '4':printf("si");break;
		case '5':printf("wu");break;
		case '6':printf("liu");break;	
		case '7':printf("qi");break;
		case '8':printf("ba");break;
		case '9':printf("jiu");break;

}
		if(i_1 == strlen(zhuan)-1){
		}
		else{
			printf(" ");}
	}
return 0;}

1004

#include<stdio.h>
#include<string.h>
int main(){
	int num;
	scanf("%d",&num);
	int to = 0,bo = 0,grade = 0;
	char top[2][20],bottom[2][20];
	for(int j = 0;j < num;j++){
		char t[3][20];
		scanf("%s %s %d",&t[0],&t[1],&grade);
		if(j == 0){
			to = grade;
			bo = grade;
			strcpy(top[0],t[0]);
			strcpy(top[1],t[1]);
			strcpy(bottom[0],t[0]);
			strcpy(bottom[1],t[1]);
		}else if(grade > to){
			to = grade;
			strcpy(top[0],t[0]);
			strcpy(top[1],t[1]);
	
	
		}else if(grade<bo){
			bo = grade;
			strcpy(bottom[0],t[0]);
			strcpy(bottom[1],t[1]);}

	}
	printf("%s %s\n",top[0],top[1]);
	printf("%s %s\n",bottom[0],bottom[1]);
return 0;}

1005

#include<stdio.h>
#include<string.h>

bool search(int a[],int b){
	int i = 0;
	while(a[i]!=0){
		if(b== a[i]){
		return false;}
		i++;
	}
	a[i] = b;
	return true;}

void method(int b,int a[]){
	while(search(a,b)){
		if(b%2==0){
			b = b/2;}
		else{
			b = (3*b+1)/2;
		}if(b!=1){
			method(b,a);}
		else{
		break;}
		}
	}
int main(){
	int num;
	int a[100] = {0};
	int t[100] = {0};
	scanf("%d",&num);
	for(int i = 0;i < num;i++){
		scanf("%d",&t[i]);
		if(t[i]!=2){
			if(t[i]%2==0){
				method(t[i]/2,a);}
			else{
				method((3*t[i]+1)/2,a);}
		}else{
			break;
		}
	}
	int k,j = 0;
	int c[20] = {0};
	for(k = 0;k<100;k++){
		if(t[k]== 0){
			break;}
	}
	for(int i1 =0;i1<k;i1++){
		bool bol = search(a,t[i1]);		
		
		if(bol){
			c[j] = t[i1];
			j++;
		}
	}
	for(int i2 = 0;i2<j-1;i2++){
		for(int i3 = 0;i3<j-1;i3++){
			if(c[i3]<c[i3+1]){
				int temp = c[i3];
				c[i3] = c[i3+1];
				c[i3+1] = temp;
			}
		}
	}
	for(int i4 = 0;i4 <j;i4++){
		printf("%d",c[i4]);
		if(i4!=j-1){
			printf(" ");}else{
			printf("\n");}}
return 0;}

非完全正确22/25,思路是用先求出关键数,再用冒泡做排序,建议不需要额外存数列,采用标记法

1007

#include<stdio.h>
#include<string.h>
int main(){
	int t[100001] = {0};
	int n;
	scanf("%d",&n);
	for(int i = 1;i<=n;i++){
		for(int i1 = 1;i1 <=i;i1++){
			if(i%i1==0&&i1!=1&&i1!=i){
				t[i] = 1;
				
				break;
			}
			
		}
	}
	for(int ii = 1;ii <= n;ii++){
		if(t[ii]==0){
			printf("%d\n",ii);}}
	int num = 0;
	for(int i2 =1;i2 <=n;i2++){
		if(t[i2]==0){
				if(t[i2+2]==0&&(i2+2)<=n){
					num++;i2 = i2+3;
						}
					}
	
				}
	printf("%d\n",num);
return 0;}

非完全正确,18/20,因为1不是素数。真尴尬,差的2分因为没有用sqrt()求根函数判断素数,但是没搞懂用全循环为什么不行,怀疑应该是时间太久了,使用time.h的clock函数可以检测运行时间

	clock_t start,end;  
	start = clock();  
end = clock(); 
	printf("time(秒)=%f\n",(double)(end-start)/CLK_TCK); 

1010



	#include<stdio.h>
	#include<string.h>
	#include<math.h>
	#include<time.h>
	int main(){
		int i = 0,m[2000] = {0};
		while(scanf("%d %d",&m[i],&m[i+1])!=EOF){

			if(m[i+1]!=0){
				m[i] = m[i]*m[i+1];
				m[i+1]--;
				i+=2;
			}else{
			}
				
		}
		printf("\n");
		for(int j = 0;j <=i-1;j+=2){
		printf("%d %d",m[j],m[j+1]);
		if(j!=i-2){
			printf(" ");
		}else{
			printf("\n");}

		}
		
	return 0;}

没读懂题,题目要求当都为0时输出0 0,不要额外加回车

ac代码

	#include<stdio.h>
	#include<string.h>
	#include<math.h>
	#include<time.h>
	int main(){
		int i = 0,m[2000] = {0};
		while(scanf("%d %d",&m[i],&m[i+1])!=EOF){

			if(m[i+1]!=0){
				m[i] = m[i]*m[i+1];
				m[i+1]--;
				i+=2;
			}else{
			}
				
		}
		if(i==0){
		printf("0 0");}
		for(int j = 0;j <=i-1;j+=2){
		printf("%d %d",m[j],m[j+1]);
		if(j!=i-2){
			printf(" ");
		}else{
			}

		}
		
	return 0;}

1011

	#include<stdio.h>
	#include<string.h>
	#include<math.h>
	#include<time.h>
	int main(){
		int num;
		long long m,n,o;
		scanf("%d",&num);
		for(int i = 0;i<num;i++){
			
			scanf("%lld %lld %lld",&m,&n,&o);
      long long add = m+n;
			if(add>o){
					printf("Case #%d: true",i+1);
			}else{
					printf("Case #%d: false",i+1);
			}
			if(i != num-1){
				printf("\n");
			}
	}
	return 0;}

vc不支持c99,此处用long long来保存数字,仅能用long long

PAT乙级1013

	#include<stdio.h>
	#include<string.h>
	#include<math.h>
	#include<time.h>
	int main(){
		int m,n;
		scanf("%d %d",&m,&n);
		int temp = 2;
		int num = 0;
		int row = 0; 
		int i = 3;
		if(m == 1){
			printf("2");
			m++;
			if(n!=1){
			printf(" ");
			row++;}
		}

		while(num<=(n-m)){
				for(int j = 1;j <= sqrt(i);j++){
					if(i%j==0&&i!=j&&j!=1){
						break;
					}
					if(j+1>sqrt(i)){
						if(temp<m){
							temp++;}
						else{
							printf("%d",i);
							if(num!=n-m){
								if(row<9){
									printf(" ");
									row++;
								}else{
									row = 0;
									printf("\n");
								}
							}
							num++;
						}
					}

				}			
			i+=2;
		}
	return 0;}

一开始对于输出的特殊情况考虑不周和空格间隔数计算不对,比如输入 1 1

1014

#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){
		char ch[4][61];
		for(int i = 0;i<4;i++){
			scanf("%s",&ch[i]);
		}
		int flag1 = 0,flag2 = 0;
		for(i = 0;i < strlen(ch[0]);i++){
			if(64<ch[0][i]&&ch[0][i]<72&&flag1 == 0){
				for(int i1 = 0;i1 < strlen(ch[1]);i1++){
					if(ch[0][i] == ch[1][i1]){

							switch(ch[0][i] - 64){
							case 1:printf("MON ");break;
							case 2:printf("TUE ");break;
							case 3:printf("WED ");break;
							case 4:printf("THU ");break;
							case 5:printf("FRI ");break;
							case 6:printf("SAT ");break;
							case 7:printf("SUN ");break;
							}
							flag1 = i1;
							i++;
							break;
							
						
					}
				}
			}
			if(((47<ch[0][i]&&ch[0][i]<58&&flag2 == 0)||(64<ch[0][i]&&ch[0][i]<79&&flag2 == 0))&&flag1>0){
				for(int i2 = flag1;i2 < strlen(ch[1]);i2++){
					if(ch[0][i] == ch[1][i2]){

							switch(ch[0][i] - 48){
							case 0:printf("00:");break;
							case 1:printf("01:");break;
							case 2:printf("02:");break;
							case 3:printf("03:");break;
							case 4:printf("04:");break;
							case 5:printf("05:");break;
							case 6:printf("06:");break;
							case 7:printf("07:");break;
							case 8:printf("08:");break;
							case 9:printf("09:");break;
							case 17:printf("10:");break;
							case 18:printf("11:");break;
							case 19:printf("12:");break;
							case 20:printf("13:");break;
							case 21:printf("14:");break;
							case 22:printf("15:");break;
							case 23:printf("16:");break;
							case 24:printf("17:");break;
							case 25:printf("18:");break;
							case 26:printf("19:");break;
							case 27:printf("20:");break;
							case 28:printf("21:");break;
							case 29:printf("22:");break;
							case 30:printf("23:");break;
							}
							flag2 = i2;
							break;
							
						
					}
				}
			}
			if(flag1 >0&&flag2 >0){
			break;}
		}
		for(int ii =0;ii < strlen(ch[2]);ii++){
			if(ch[2][ii] == ch[3][ii]&&ch[2][ii]>64&&ch[2][ii]<123){
				if(ii<10){
					printf("0%d",ii);
				}else{
					printf("%d",ii);
				}
				break;
			}
		}
	return 0;}

==编译错误,gcc不支持for循环里创建的变量再次使用,又是题意搞错了,
1.for循环找到a[i]==b[i]并且 a[i]>=‘A’&&a[i]<=‘G’ ,记录DAY,continue;
2.继续运行找到a[i]==b[i]并且a[i]>=‘0’&&a[i]<=‘9’ || a[i]>=‘A’&&a[i]<=‘N’,记录HH,break;
3.再开一个for循环找到c[i]d[i]并且 c[i]>=‘a’&&c[i]<=‘z’ || c[i]>=‘A’&&c[i]<=‘Z’ ,记录MM,break;

ac代码

#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){
		char ch[4][61];
		for(int m = 0;m<4;m++){
			scanf("%s",&ch[m]);
		}
		int flag1 = 0;
		for(int i = 0;i < strlen(ch[0]);i++){
			if(ch[0][i]>='A'&&ch[0][i]<='G'&&flag1 == 0&&ch[0][i] == ch[1][i]){


							switch(ch[0][i] - 'A'){
							case 0:printf("MON ");break;
							case 1:printf("TUE ");break;
							case 2:printf("WED ");break;
							case 3:printf("THU ");break;
							case 4:printf("FRI ");break;
							case 5:printf("SAT ");break;
							case 6:printf("SUN ");break;
							}
							flag1 = 1;
							continue;
							
						
					
				
			}
			if(((ch[0][i]>='0'&&ch[0][i]<='9')||(ch[0][i]>='A'&&ch[0][i]<='N'))&&flag1>0&&ch[0][i] == ch[1][i]){



							switch(ch[0][i] - '0'){
							case 0:printf("00:");break;
							case 1:printf("01:");break;
							case 2:printf("02:");break;
							case 3:printf("03:");break;
							case 4:printf("04:");break;
							case 5:printf("05:");break;
							case 6:printf("06:");break;
							case 7:printf("07:");break;
							case 8:printf("08:");break;
							case 9:printf("09:");break;
							case 17:printf("10:");break;
							case 18:printf("11:");break;
							case 19:printf("12:");break;
							case 20:printf("13:");break;
							case 21:printf("14:");break;
							case 22:printf("15:");break;
							case 23:printf("16:");break;
							case 24:printf("17:");break;
							case 25:printf("18:");break;
							case 26:printf("19:");break;
							case 27:printf("20:");break;
							case 28:printf("21:");break;
							case 29:printf("22:");break;
							case 30:printf("23:");break;
							}
							break;
							
						
					
			}
		}
		for(int ii =0;ii < strlen(ch[2]);ii++){
			if((ch[2][ii] == ch[3][ii])&&((ch[2][ii]>='a'&&ch[2][ii]<='z')||(ch[2][ii]>='A'&&ch[2][ii]<='Z'))){
				if(ii<10){
					printf("0%d",ii);
				}else{
					printf("%d",ii);
				}
				break;
			}
		}
	return 0;}

1015

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<time.h>
struct stu{
	int number;
	int de;
	int cai;
	int dj;
}t[100000];
int main(){
	int m[3];
	scanf("%d %d %d",&m[0],&m[1],&m[2]);
	int i;
	int num = 0;
	for(i = 0;i < m[0];i++){
		scanf("%d %d %d",&t[i].number,&t[i].de,&t[i].cai);
		if(t[i].de>=m[2]&&t[i].cai>=m[2]){
			t[i].dj = 1;
		}else if(t[i].de>=m[2]&&t[i].cai>=m[1]){
			t[i].dj = 2;
		}else if(t[i].de>=t[i].cai&&t[i].de>=m[1]&&t[i].cai>=m[1]){
			t[i].dj = 3;
		}else if(t[i].de>=m[1]&&t[i].cai>=m[1]){
			t[i].dj = 4;
		}else{
				i--;
				m[0]--;}
		
	}
	for(int j =1;j<m[0];j++){		
	for(i = 1;i < m[0];i++){
		int temp1;
		bool bol = false;
		if(t[i-1].dj>t[i].dj){
			bol = true;
		}else if(((t[i-1].de+t[i-1].cai)<(t[i].de+t[i].cai))&&t[i-1].dj==t[i].dj){
			bol = true;
		}else if(t[i-1].dj==t[i].dj&&((t[i-1].de+t[i-1].cai)==(t[i].de+t[i].cai))&&t[i-1].de<t[i].de){
			bol = true;
		}else if(t[i-1].dj==t[i].dj&&((t[i-1].de+t[i-1].cai)==(t[i].de+t[i].cai))&&t[i-1].de==t[i].de&&t[i-1].number>t[i].number){
			bol = true;
		}
		if(bol){
			temp1 = t[i-1].number;
			t[i-1].number = t[i].number;
			t[i].number = temp1;
			temp1 = t[i-1].de;
			t[i-1].de = t[i].de;
			t[i].de = temp1;
			temp1 = t[i-1].cai;
			t[i-1].cai = t[i].cai;
			t[i].cai = temp1;
			temp1 = t[i-1].dj;
			t[i-1].dj = t[i].dj;
			t[i].dj = temp1;

		}

	}}
	printf("%d\n",m[0]);
	for(i = 0;i < m[0];i++){
		printf("%d %d %d\n",t[i].number,t[i].de,t[i].cai);
	}
	return 0;}

方法绝对超时了,注意结构体的使用,应该先分类后排序,按类别排序

1017

除法可以一位一位除

1019

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<time.h>
void sort(char c[]){
	int i,k;
		for(i = 0;i<3;i++){
				for(int j = 0;j < 3;j++){
					if(c[j]>c[j+1]){
						char temp;
						temp = c[j];
						c[j] = c[j+1];
						c[j+1] = temp;
					}
				}
		}
		
		int a[2] = {0,0};
		for(k = 0;k < 4;k++){
			a[0] = a[0]*10 + c[k] - '0'; 
			a[1] = a[1]*10 + c[3-k] - '0';
			
		}
			if(a[0]<10){
				printf("%d - 000%d = ",a[1],a[0]);
	
			}else if(a[0]<100){
				printf("%d - 00%d = ",a[1],a[0]);
			}else if(a[0]<1000){
				printf("%d - 0%d = ",a[1],a[0]);
			}else{
				printf("%d - %d = ",a[1],a[0]);
			}
			if(a[1]-a[0]<10){
				printf("000%d",a[1]-a[0]);
			}else if(a[1]-a[0]<100){
				printf("00%d",a[1]-a[0]);
			}else if(a[1]-a[0]<1000){
				printf("0%d",a[1]-a[0]);
			}else{
				printf("%d",a[1]-a[0]);
			}
			if(a[1]-a[0]==6174){
			}else{
				printf("\n");
			sprintf(c,"%04d",a[1]-a[0]);

					sort(c);
			}
		
}
int main(){
	char c[5];
	while(1){
		(void)scanf("%s",c);
		if(c[0]==c[1]&&c[1]==c[2]&&c[2]==c[3]){
			printf("%s - %s = 0000",c,c);
			
		}else{
			sort(c);
		

	
	}}

return 0;}

部分正确,三个测试点失败,至今不懂原因,更好的方法是用整型数组来存每一位数,然后输出采用%04d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值