PAT 乙级------ 1036 ~ 1040 附代码与思路;跟奥巴马一起编程、在霍格沃茨找零钱、统计同成绩学生、到底买不买、有几个PAT

本文包含四个编程挑战的解决方案,涉及字符串操作、数学计算、数组统计和字符处理。第一个题目要求构造特定格式的字符串,第二个是处理找零问题,第三个统计相同成绩的学生数量,第四个检查珠子购买可行性。每个挑战都提供了清晰的思路和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  “无论是否能验证其真伪,都应无条件给予其基本的善意和尊重,是人性中的善良本能,是我们之所以成为人的前提,也是维系文明的纽带” PEACE & LOVE


1036 跟奥巴马一起编程
思路: 两种字符串形式,首尾两行和中间部分,根据输入的值组成字符串输出即可。

#include<stdio.h>
#define LEN 30

int main() {
	int column, row;
	char ch, firstRow[LEN], _row[LEN];//firstRow[]首尾两行, ——row[]中间部分
	scanf("%d %c", &column, &ch);
	row = (int)(1.0*column/2+0.5)-2;//四舍五入
	for(int i=0; i<column; i++)
		firstRow[i] = ch;
	firstRow[column] = '\0';//字符串末尾添加结束符
	_row[0] = ch;//中间部分的每一行的头尾是字符
	for(int i=1; i<column-1; i++)//中间部分是空格
		_row[i] = ' ';
	_row[column-1] = ch;
	_row[column] = '\0';
	printf("%s\n", firstRow);
	while(row-- > 0)
		printf("%s\n", _row);
	printf("%s", firstRow);
	return 0;
}

在这里插入图片描述
1037 在霍格沃茨找零钱
思路: 转换为最小单位进行计算,通过取余输出结果。计算累加和之前一定要初始化为0!!!

#include<stdio.h>
#define LEN 10

int main() {
	int price[LEN], pay[LEN], rate[] = {17, 29, 1};//应付价格, 实付价格
	pay[0] = price[0] = 0;
	scanf("%d.%d.%d %d.%d.%d", &price[1], &price[2], &price[3], &pay[1], &pay[2], &pay[3]);
	for(int i=1; i<4; i++) { //将价格转为最小单位;结果存储在0位置上
		for(int j=i; j<4; j++) {
			pay[i] *= rate[j-1];
			price[i] *= rate[j-1];
		}
		pay[0] += pay[i];
		price[0] += price[i];
	}
	if(price[0] <= pay[0]) { //支付大于应付
		pay[0] -= price[0];
	} else {
		pay[0] = price[0] - pay[0];
		putchar('-');
	}
	printf("%d.%d.%d", pay[0]/(rate[0]*rate[1]), pay[0]%(rate[0]*rate[1])/29, pay[0]%29);
	return 0;
}

在这里插入图片描述
1038 统计同成绩学生
思路: 用哈希表,成绩作为下标,数组内容记录该成绩学生个数;

#include<stdio.h>
#define LEN 101

int main() {
	int cnt, tmp, grade[LEN] = {0};
	scanf("%d", &cnt);
	for(int i=0; i<cnt; i++) {
		scanf("%d", &tmp);//成绩作为数组下标,数组内容记录该成绩学生数量
		grade[tmp]++;
	}
	scanf("%d", &cnt);
	for(int i=0; i<cnt; i++) {
		scanf("%d", &tmp);
		printf("%d", grade[tmp]);
		if(i != cnt-1)
			putchar(' ');
	}
	return 0;
}

在这里插入图片描述
1039 到底买不买
思路: 对商家所卖珠子利用字符的asc码作数组下标存储各珠子数量。之后判断所需珠子数量是否足够即可。

#include<stdio.h>
#include<ctype.h>
#define LEN 100

int main() {
	int ch, cnt, _cnt, index, possesses[LEN]= {0};
	cnt = _cnt = 0;//珠子数量和所需珠子数量
	while((ch=getchar()) != '\n') {
		if(isdigit(ch))
			index = ch-'0';
		else if(islower(ch))
			index = ch-'a'+10;
		else if(isupper(ch))
			index = ch-'A'+36;
		possesses[index]++;
		cnt++;
	}
	while((ch=getchar()) != '\n') {
		if(isdigit(ch))
			index = ch-'0';
		else if(islower(ch))
			index = ch-'a'+10;
		else if(isupper(ch))
			index = ch-'A'+36;
		if(possesses[index]) {//该颜色珠子数量不为零
			possesses[index]--;
			cnt--;
		} else
			_cnt++;//珠子缺少数量加一
	}
	if(!_cnt)
		printf("Yes %d", cnt);
	else
		printf("No %d", _cnt);
	return 0;
}

在这里插入图片描述
1040 有几个PAT
思路: 对于每个A, A前边P的个数 * A后边T的个数就是这个A可以组成的PAT的个数。所以通过两次遍历确定每个A前有多个P,后有多少个T,乘积求和得到PAT个数。P T的个数要定义为long。

#include<stdio.h>
#include<string.h>
#define LEN 100001

int main() {
	char str[LEN];
	int arr[LEN] = {0};
	long  cnt, sum;
	scanf("%s", &str);
	cnt = sum = 0;
	for(int i=0; str[i]!='\0'; i++) {
		if(str[i] == 'P')
			cnt++;
		else if(str[i] == 'A')
			arr[i] = cnt;
	}
	cnt = 0;
	for(int i=strlen(str); i>=0; i--) {
		if(str[i] == 'T')
			cnt++;
		else if(str[i] == 'A')
			sum += arr[i]*cnt;
	}
	printf("%d",sum%1000000007);
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值