PTA L1系列题解(C语言)(L1_017 -- L1_024)

L1-017 到底有多二

题目内容:

解题思路:

        本题主要任务是从输入的数字中 获取2的个数,获取数字的长度,是否为负数,是否为偶数

本题难度并不特别大,就只提供几个建议进行参考:

1.使用字符数组进行存储,由于本题需要获取长度,并且其余操作也都是单个位置上的数据进行判断。

2.数字长度与是否为负数有关,可以定义一个标记量,在判断是否为负数后,修改标记量。

3.输出为百分比,故最后要 * 100,同时要注意%的输出。

C代码展示:

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

int main() {
    int cnt = 0, k = 0; // 定义计数器cnt,用于统计'2'的数量,k用于调整字符串长度
    float ans, x = 1; // 定义答案变量ans,以及调整因子x
    char s[100]; // 定义字符数组s,用于存储输入的字符串
    gets(s); // 使用gets函数读取字符串。

    if (s[0] == '-') { // 如果字符串的第一个字符是'-'
        x *= 1.5; // 调整因子x乘以1.5
        k = -1; // 将k设置为-1,用于后续调整字符串长度
    }
    if ((s[strlen(s) - 1] - '0') % 2 == 0) { // 如果字符串最后一个字符是偶数
        x *= 2; // 调整因子x乘以2
    }
    for (int i = 0; i < strlen(s); i++) { // 遍历字符串中的每个字符
        if (s[i] == '2') { // 如果字符是'2'
            cnt++; // '2'的计数器加1
        }
    }
    ans = 1.0 * cnt / (strlen(s) + k) * x * 100; // 计算百分比,考虑调整因子和调整后的字符串长度
    printf("%.2f%%\n", ans); // 输出计算出的百分比,保留两位小数

    return 0;
}

L1-018 大笨钟

题目内容:

解题思路:

本题按照小时分为三种情况:12时内,正好为12时,大于12时。然后根据分钟还需要进行一些调整。

12时内:固定不会输出。

12时时:当分钟不为0时,输出一个Dang。

12时后,当分钟不为0时,输出的Dang需要增加一次。

C代码展示:

#include <stdio.h>

int main() {
    int h, m, k = 0; // 定义整数变量h(小时)、m(分钟)和k(用于调整小时数)
    scanf("%d:%d", &h, &m);

    if (h < 12) {
        printf("Only %02d:%02d.  Too early to Dang.\n", h, m);
    }
    else if (h == 12) {
        if (m == 0) {
            printf("Only %02d:%02d.  Too early to Dang.\n", h, m);
        }
        else {
            printf("Dang\n");
        }
    }
    else {
        if (m > 0) k++; // 如果分钟数大于0,k加1,用于后续计算
        for (int i = 0; i < h - 12 + k; i++) { // 循环次数为小时数减去12再加上k
            printf("Dang");
        }
        printf("\n");
    }

    return 0;
}

L1-019 谁先倒

题目内容:

解题思路:

本题只需要一次循环遍历每次的猜拳情况,然后增加甲或乙的喝酒杯数。

注意点:题中所说的最多喝的杯数是他不会倒的,例如,甲的杯数为2,那当甲喝了3杯时才会倒下。

C代码展示:

#include <stdio.h>

int main() {
    int a, b, _a=0, _b=0, n, k;
 // 定义甲、乙的初始酒量a、b,甲、乙喝的杯数_a、_b,划拳记录数n,以及中间变量k
    int s[105][5];

    scanf("%d %d", &a, &b);
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 4; j++)
            scanf("%d", &s[i][j]);
        if (!(a - _a < 0 || b - _b < 0)) { // 如果甲、乙都没倒下
            k = 0; // 初始化k
            if (s[i][1] == s[i][0] + s[i][2]) { // 如果甲划的数字等于甲喊与乙喊之和
                k += 1; // k设置为1,表示甲赢
            }
            if (s[i][3] == s[i][0] + s[i][2]) { // 如果乙划的数字等于甲喊与乙喊之和
                k += 2; // k设置为2,表示乙赢
            }
            if (k == 1) { // 如果k为1,甲赢,甲喝酒杯数增加
                _a++;
            }
            if (k == 2) { // 如果k为2,乙赢,乙喝酒杯数增加
                _b++;
            }
        }
    }
    if (a - _a < 0) { // 如果甲的酒量减去甲喝的杯数小于0,说明甲倒下了
        printf("A\n%d\n", _b); // 输出A和乙喝的杯数
    } else { // 否则就是乙倒下了,输出B和甲喝的杯数
        printf("B\n%d\n", _a);
    }
    return 0;
}

L1-020 帅到没朋友

题目内容:

解题思路:

        本题可以为二维字符数组存储,也可以是整型数组存储,但是整型数组存储时要注意使用%05d进行输出,它存在少于五位数字的情况。

注意点1:要是一个朋友圈里就一个人,题目说超过一个人的朋友圈一定是不同的人,也就是说超过1的朋友圈里的人都有朋友,反之没有。

注意点2:处理重复查询的情况,可以进行标记。

注意点3:处理所有人都有朋友时,可以用标记量,当有一人没有朋友时,改变标记量即可。
 

C代码展示:

#include <stdio.h>

int main() {
    int n, flag = 1;
    int id[100005] = {0};

    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        int k;
        scanf("%d", &k);
        for (int j = 0; j < k; j++) {
            int temp; // 定义变量temp,用于临时存储输入的元素
            scanf("%d", &temp);
            if (k != 1) { // 如果序列的长度不为1
                id[temp]++; // 对应元素的标记状态加1
            }
        }
    }

    int m; // 定义变量m,用于存储后续输入的数量
    scanf("%d", &m); // 读取后续输入的数量
    for (int i = 0; i < m; i++) {
        int temp; // 定义变量temp,用于临时存储输入的元素
        scanf("%d", &temp);
        if (id[temp] == 0) { // 如果该元素的标记状态为0,即未被标记过
            if (flag) { // 如果这是第一个未标记的元素
                printf("%05d", temp); // 输出该元素,格式为5位数,不足前面补0
                flag = 0; // 更新flag状态,表示已经输出过未标记的元素
            } else { // 如果不是第一个未标记的元素
                printf(" %05d", temp); // 输出该元素,前面有空格
            }
            id[temp] = -1; // 将该元素的标记状态设置为-1,表示已经输出过
        }
    }
    if (flag) { // 如果所有元素都被标记过
        printf("No one is handsome");
    }
    printf("\n");

    return 0;
}

L1-021 重要的话说三遍

题目内容:

解题思路:

略。

C代码展示:

#include <stdio.h>
int main()
{
	printf("I'm gonna WIN!\nI'm gonna WIN!\nI'm gonna WIN!\n");
	return 0;
}

L1-022 奇偶分家

题目内容:

解题思路:

循环遍历,用%2 == 0进行判断,为真是偶数,为假是奇数。

C代码展示:

#include <stdio.h>

int main()
{
	int n, a;
	int ou = 0, qi = 0;
	scanf("%d", &n);
	for (int i=0; i<n; i++){
		scanf("%d", &a);
		if (a % 2 == 0){
			ou ++;
		}
		else{
			qi ++;
		}
	}
	printf("%d %d\n", qi, ou);
	
	return 0;
}

L1-023 输出GPLT

题目内容:

解题思路:

        循环遍历输入的字符串,当它为 G、P、L、T 或 g、p、l、t 时,使用哈希表进行存储。

        输出时,按照GPLT的顺序判断哈希表中的值是否为0,不为零就输出,当所有值都为0时跳出循环。

C代码展示:

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

int main()
{
	char s[10005];
	int cnt[5] = {0};
	gets(s);
	for (int i=0; i<strlen(s); i++){
		if (s[i] == 'g' || s[i] == 'G'){
			cnt[0]++;
		}
		if (s[i] == 'p' || s[i] == 'P'){
			cnt[1]++;
		}
		if (s[i] == 'l' || s[i] == 'L'){
			cnt[2]++;
		}
		if (s[i] == 't' || s[i] == 'T'){
			cnt[3]++;
		}
	}
	while(cnt[0] + cnt[1] + cnt[2] + cnt[3]){
		if (cnt[0] > 0){
			printf("G");
			cnt[0] --;
		}
		if (cnt[1] > 0){
			printf("P");
			cnt[1] --;
		}
		if (cnt[2] > 0){
			printf("L");
			cnt[2] --;
		}
		if (cnt[3] > 0){
			printf("T");
			cnt[3] --;
		}
	}
	printf("\n");
	
	return 0;
}

L1-024 后天

题目内容:

解题思路:

略。

C代码展示:

#include <stdio.h>

int main()
{
	int d;
	scanf("%d",&d);
	if (d>5) printf("%d\n",d-5);
	else printf("%d\n",d+2);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值