PAT乙级 ----- 1081 ~ 1084 检查密码、射击比赛、是否存在相等的差、外观数列

这两天回老家了,耽误了两天。


1081 检查密码、射击比赛、是否存在相等的差、外观数列
思路: 简单的条件判断,注意 isalpha(), isdigit()这些ctype.h中的方法返回值是非零整数和零,而不是零和一。

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define LEN 81

int main() {
	int n, ch, digitFlag, alphaFlag, illegalFlag;

	scanf("%d", &n);
	getchar();
	while(n-- > 0) {
		char temp[LEN] = "";
		digitFlag = alphaFlag = illegalFlag = 0;
		for(int i=0; (ch=getchar())!='\n'; i++) {
			temp[i] = ch;
			if(isalnum(ch) || ch=='.') {/如果是合法字符
				digitFlag = isdigit(ch)!=0 ? 1 : digitFlag;//更新数字标志
				alphaFlag = isalpha(ch)!=0 ? 1 : alphaFlag;//更新字母标志
			} else
				illegalFlag = 1;//更新非法字符标志
		}
		if(strlen(temp) < 6)//长度不够
			puts("Your password is tai duan le.");
		else {
			if(illegalFlag)//有非法字符
				puts("Your password is tai luan le.");
			else if(alphaFlag==1 && digitFlag==0)//有字母没数字
				puts("Your password needs shu zi.");
			else if(alphaFlag==0 && digitFlag==1)//有数字没字母
				puts("Your password needs zi mu.");
			else if(alphaFlag==1 && digitFlag==1)//合法密码
				puts("Your password is wan mei.");
		}
	}
	return 0;
}

在这里插入图片描述
1082 射击比赛
思路: 算平方和即可,不需要计算开方。

#include<stdio.h>
#define LEN 10000

int main() {
	int n, min, max, minId, maxId;

	max = 0;
	min = 10000;
	scanf("%d", &n);
	while(n-- > 0) {
		int x, y, id;
		scanf("%d%d%d", &id, &x, &y);
		x = x*x + y*y;
		if(x < min) {
			min = x;
			minId = id;
		}
		if(x > max) {
			max = x;
			maxId = id;
		}
	}
	printf("%.4d %.4d", minId, maxId);
	return 0;
}

在这里插入图片描述
1083 是否存在相等的差
思路: 循环相减即可,注意 1. 是差的绝对值。 2. 要输出重复的差

#include<stdio.h>
#include<math.h>
#define LEN 10000

int main() {
	int n, arr[LEN] = {0};

	scanf("%d", &n);
	for(int i=1; i<=n; i++) {
		int x;
		scanf("%d", &x);
		arr[abs(x-i)]++;
	}
	for(int i=n-1; i>=0; i--)
		if(arr[i] > 1)
			printf("%d %d\n", i, arr[i]);
	return 0;
}

在这里插入图片描述
1084 外观数列
思路; 本质是一个数字符个数的题,两个指针front rear, rear遍历字符数组,rear指向的字符与front相等,则计数器自增一,rear指向下一个字符,若不同则将front所指向的字符以及计数器的值写入结果数组中。注意,把数组设大一些 ,测试点四的结果很大。

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

int main() {
	int n;
	char d[LEN];
	scanf("%s %d", &d, &n);
	while(n-- > 1) {
		char temp[LEN] = "";
		int i, front, rear, count;

		front = rear = 0;
		count = 1;
		for(i=0; d[front]!='\0';) {
			rear++;
			if(d[front] == d[rear])
				count++;
			else {//rear 和 front 指向的字符不同
				temp[i++] = d[front];//将front指向的字符写入结果数组
				temp[i++] = count+'0';//将计数器的值写入结果数组
				front = rear;//front指向rear
				count = 1;//计数器归1
			}
		}
		temp[i] = '\0';
		strcpy(d, temp);//将结果数组拷贝到原数组中,作下一次循环
	}
	puts(d);
	return 0;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值