0
点赞
收藏
分享

微信扫一扫

PAT Practice 乙级------小赌怡情、开学寄语、多选题常见计分法、宇宙无敌加法器

程序小小黑 2022-03-30 阅读 22

小赌怡情 (15 分)
水题

#include<stdio.h>
int main() {
	int total, n, num1, num2, b, t;
	scanf("%d %d",&total, &n);
	for(int i=0; i<n; i++) {
		scanf("%d %d %d %d",&num1, &b, &t, &num2);
		if(t > total) {
			printf("Not enough tokens.  Total = %d.", total);
		} else {
			if(num1>num2 == !b) {
				total += t;
				printf("Win %d!  Total = %d.", t, total);
			} else {
				total -= t;
				printf("Lose %d.  Total = %d.", t, total);
			}
			if(total <= 0) {
				printf("\nGame Over.");
				break;
			}
		}
		if(i !=n-1)
			printf("\n");
	}
}

在这里插入图片描述
开学寄语 (20 分)
思路 三层循环暴力破解

#include<stdio.h>
/*
U: 6666 6666
GG: 2333
JJ: 6666 2333
3 5

*/
int main() {
	int m, n, x, arr[6] = {0};
	int cnt = 0;//学生数
	int _cnt =0;//违禁物品数
	scanf("%d %d", &m, &n);
	for(int i=0; i<n; i++)
		scanf("%d",&arr[i]);
	for(int i=0; i<m; i++) {
		int k = 0;
		int flag = 0;
		char name[5];
		scanf("%s %d", &name, &k);
		for(int j=0; j<k; j++) {
			scanf("%d", &x);
			for(int l=0; l<n; l++) {
				if(x==arr[l]) {
					_cnt++;
					if(!flag) {//对于每个学生而言,第一次查到违禁物品要先输出名字,再输出违禁物品编号
						printf("%s:",name);
						cnt++;
						flag  = 1;
					}
					printf(" %.4d",x);
				}
			}
		}
		if(flag)//如果学生有违禁物品,flag会置为1.如此可以判断是否需要输出换行
			printf("\n");
	}
	printf("%d %d",cnt, _cnt);
}

在这里插入图片描述
多选题常见计分法 (20 分)
这个题给的输出样例是错的吧,第三题的b是正确选项,测试样例显示第三题b选项错了两次
在这里插入图片描述

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

typedef struct _project {
	float grade;
	int total;
	char ans[15];
	int wrong[5];//abcde这五个选项各错了几次
	int cnt;//本题错误次数
} Project;
int Check(char s1[], char s2[], Project* p, int* max);

int main() {
	int n, m, max = 0;//max:m个题中,错误最多的次数
	char ch[15] = "";
	Project project[1000];
	scanf("%d %d", &n, &m);
	for(int i=0; i<m; i++) {
		project[i].cnt = 0;
		for(int j=0; j<5; j++)
			project[i].wrong[j] = 0;
		scanf("%f %d ", &project[i].grade, &project[i].total);
		fgets(project[i].ans, 15, stdin);//若从stdin拿到的字符串长度小于14,会把\n也放到字符串中
		if(project[i].ans[strlen(project[i].ans)-1]== '\n')
			project[i].ans[strlen(project[i].ans)-1] = '\0';
	}
	for(int i=0; i<n; i++) {
		char c;
		float grade = 0;
		for(int j=0; j<m;) {
			if((c=getchar()) == '(') {
				scanf("%[^)]",&ch);
				if(strcmp(ch,project[j].ans) == 0)//答案完全正确
					grade += project[j].grade;
				else {
					project[j].cnt++;
					if(Check(project[j].ans, ch, &project[j], &max) == 0)
						grade += project[j].grade/2;
				}
				j++;
			}
		}
		printf("%.1f\n",grade);
	}
	if(max == 0) {
		printf("Too simple");
	} else {
		n = 0;
		for(int i=0; i<m; i++) {
			if(project[i].cnt >= max) {
				for(int j=0; j<5; j++) {
					if(project[i].wrong[j] == max) {
						if(n)
							printf("\n");
						printf("%d %d-%c", max, i+1, 'a'+j);
						n=1;
					}
				}
			}
		}
	}
}

int Check(char s1[], char s2[], Project* p, int* max) {
	int flag, res = 0;//是否有错选,有则返回1没有返回0;
	for(int i=2; s2[i]!='\0'; i++) {
		if(s2[i] == ' ')
			continue;
		flag = 0;
		for(int j=2; s1[j]!='\0'; j++) {
			if(s2[i] == s1[j] && s2[i] != ' ') {
				flag = 1;
				break;
			}
		}
		if(!flag) { //一轮比较后flag没变化,说明是一个错误选项
			*max = ++p->wrong[s2[i]-'a'] > *max?p->wrong[s2[i]-'a']: *max;//记录选项错误次数最多的情况
			res =1;
		}
	}
	return res;
}

宇宙无敌加法器 (20 分)
Note:

  1. 结果最高位不可以是0;
  2. 如果结果是0要输出0;
  3. 两个数字相加的结果有可能大于两数字的长度;
  4. 两个数字,较短的数字高位补零用于继续和较长的数字计算。
#include<stdio.h>
#include<string.h>

int main() {
	char s[30], num1[30], num2[30], res[30];
	int d = 0;
	int flag = 0;
	scanf("%s\n%s\n%s", &s, &num1, &num2);
	int i = strlen(s)-1;
	int j = strlen(num1)-1;
	int k = strlen(num2)-1;
	int l = 29;
	res[30] = '\0';//字符数组末尾加'\0'
	for(; l >= 0; i--) {
		int a, b, c = s[i] - '0';
		if(c == 0)
			c = 10;
		a = j>=0?num1[j--]-'0':0;//当数组下标小于等于0,则用0继续计算
		b = k>=0?num2[k--]-'0':0;//同上
		res[l--] = (a+b+d)%c+'0';
		d = (a+b+d)/c;//进位
	}
	for(i=0; res[i]!='\0'; i++) {
		if(res[i]=='0' && !flag)//高位的0不可以输出
			continue;
		putchar(res[i]);
		flag = 1;//一旦有个非零数字输出,flag置为1.之后的0就可以正常输出了
	}
	if(flag == 0)
		putchar('0');
	return 0;
}

在这里插入图片描述

举报

相关推荐

0 条评论