当前位置:   article > 正文

【PTA 题解】L1-083 谁能进图书馆(标志位)(C+Python)_c语言pat基础题 l1 083

c语言pat基础题 l1 083

题目

为了保障安静的阅读环境,有些公共图书馆对儿童入馆做出了限制。例如“12 岁以下儿童禁止入馆,除非有 18 岁以上(包括 18 岁)的成人陪同”。现在有两位小/大朋友跑来问你,他们能不能进去?请你写个程序自动给他们一个回复。

输入格式:

输入在一行中给出 4 个整数:
禁入年龄线 陪同年龄线 询问者1的年龄 询问者2的年龄
这里的禁入年龄线是指严格小于该年龄的儿童禁止入馆;陪同年龄线是指大于等于该年龄的人士可以陪同儿童入馆。默认两个询问者的编号依次分别为 12;年龄和年龄线都是 [1, 200] 区间内的整数,并且保证 陪同年龄线 严格大于 禁入年龄线

输出格式:

在一行中输出对两位询问者的回答,如果可以进就输出 年龄-Y,否则输出 年龄-N,中间空 1 格,行首尾不得有多余空格。

在第二行根据两个询问者的情况输出一句话:

  • 如果两个人必须一起进,则输出 qing X zhao gu hao Y,其中 X 是陪同人的编号, Y 是小孩子的编号;
  • 如果两个人都可以进但不是必须一起的,则输出 huan ying ru guan
  • 如果两个人都进不去,则输出 zhang da zai lai ba
  • 如果一个人能进一个不能,则输出 X: huan ying ru guan,其中 X 是可以入馆的那个人的编号。

输入样例 1:

12 18 18 8
  • 1

输出样例 1:

18-Y 8-Y
qing 1 zhao gu hao 2
  • 1
  • 2

输入样例 2:

12 18 10 15
  • 1

输出样例 2:

10-N 15-Y
2: huan ying ru guan
  • 1
  • 2

解析

可以列表分析,假设 A 0 B 0 表示 A 为状态 0,B 为状态 0。
状态 0:< 禁入年龄线
状态 1:禁入年龄线 ~ 陪同年龄线
状态 2:>= 陪同年龄线

用 Excel 列成表格,然后翻译成对应的代码即可
excel 表格

代码

Python 版本

min_entry_age, min_parent_age, age1, age2 = [int(x) for x in input().split(' ')]

if age1 < min_entry_age:
    state1 = 0
elif age1 < min_parent_age:
    state1 = 1
elif age1 >= min_parent_age:
    state1 = 2
if age2 < min_entry_age:
    state2 = 0
elif age2 < min_parent_age:
    state2 = 1
elif age2 >= min_parent_age:
    state2 = 2
    
match (state1, state2):
	case (0, 0):
		print(f'{age1}-N {age2}-N')
		print('zhang da zai lai ba')
	case (0, 1):
		print(f'{age1}-N {age2}-Y')
		print('2: huan ying ru guan')
	case (0, 2):
		print(f'{age1}-Y {age2}-Y')
		print('qing 2 zhao gu hao 1')
	case (1, 0):
		print(f'{age1}-Y {age2}-N')
		print('1: huan ying ru guan')
	case (1, 1):
		print(f'{age1}-Y {age2}-Y')
		print('huan ying ru guan')
	case (1, 2):
		print(f'{age1}-Y {age2}-Y')
		print('huan ying ru guan')
	case (2, 0):
		print(f'{age1}-Y {age2}-Y')
		print('qing 1 zhao gu hao 2')
	case (2, 1):
		print(f'{age1}-Y {age2}-Y')
		print('huan ying ru guan')
	case (2, 2):
		print(f'{age1}-Y {age2}-Y')
		print('huan ying ru guan')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

C 版本

#include <stdio.h>

int main() {
    int min_entry_age, min_parent_age, age1, age2;
    scanf("%d %d %d %d", &min_entry_age, &min_parent_age, &age1, &age2);

    int state1, state2;
    if (age1 < min_entry_age)
        state1 = 0;
    else if (age1 < min_parent_age)
        state1 = 1;
    else if (age1 >= min_parent_age)
        state1 = 2;

    if (age2 < min_entry_age)
        state2 = 0;
    else if (age2 < min_parent_age)
        state2 = 1;
    else if (age2 >= min_parent_age)
        state2 = 2;

    if (state1 == 0 && state2 == 0) {
        printf("%d-N %d-N\n", age1, age2);
        printf("zhang da zai lai ba\n");
    } else if (state1 == 0 && state2 == 1) {
        printf("%d-N %d-Y\n", age1, age2);
        printf("2: huan ying ru guan\n");
    } else if (state1 == 0 && state2 == 2) {
        printf("%d-Y %d-Y\n", age1, age2);
        printf("qing 2 zhao gu hao 1\n");
    } else if (state1 == 1 && state2 == 0) {
        printf("%d-Y %d-N\n", age1, age2);
        printf("1: huan ying ru guan\n");
    } else if (state1 == 1 && state2 == 1) {
        printf("%d-Y %d-Y\n", age1, age2);
        printf("huan ying ru guan\n");
    } else if (state1 == 1 && state2 == 2) {
        printf("%d-Y %d-Y\n", age1, age2);
        printf("huan ying ru guan\n");
    } else if (state1 == 2 && state2 == 0) {
        printf("%d-Y %d-Y\n", age1, age2);
        printf("qing 1 zhao gu hao 2\n");
    } else if (state1 == 2 && state2 == 1) {
        printf("%d-Y %d-Y\n", age1, age2);
        printf("huan ying ru guan\n");
    } else if (state1 == 2 && state2 == 2) {
        printf("%d-Y %d-Y\n", age1, age2);
        printf("huan ying ru guan\n");
    }

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

补充

C 语言的 switch 由于没法像 Python match 那样可以一下匹配两个数,只能写一大堆啰嗦的 if elseif。
可以考虑合并两个 state 为一个数,然后再用 switch 语句来判断。

怎么合并呢?
我们的 state 可以取 0、1、2,对应二进制 00、01、10,只需要用两个 bit 就可表示。两个 state 总共就是 4 bit,而 C 语言里最小的整数 char 也有 8 bit,完全放得下。

所以做法是,用一个 char 类型变量,总共 8 bit,从低往高(从右往左)第 1、2 位是 state1,第 3、4 位是 state2,剩下的不用,保持为 0。

比如 state1=0,state2=2,那么 state=

00 00 10(state2) 00(state1)
  • 1

也就是 8。

这是修改后的代码,相同的部分就不重复写了

char state = 0b0000;
if (age1 < min_entry_age)
    state |= 0b0001; // 1
else if (age1 < min_parent_age)
    state |= 0b0010; // 2
else
    state |= 0b0011; // 3

if (age2 < min_entry_age)
    state |= 0b0100;
else if (age2 < min_parent_age)
    state |= 0b1000;
else
    state |= 0b1100;

// switch 部分
switch (state) {
    case 0b0000:
        printf("%d-N %d-N\n", age1, age2);
        printf("zhang da zai lai ba\n");
        break;
    case 0b0001:
    	//剩下的按照上面的方法算出来就可以了
    	//...
    	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这种利用位来标记信息的方式很常见,比如标志变量 int flag,不同位的含义各不相同,为 1 表示启用,为 0 表示禁用。
这么做的好处是可以把很多参数/变量合并为一个。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/408497
推荐阅读
相关标签
  

闽ICP备14008679号