PTA L1系列题解(C语言)(L1_065 -- L1_072)

L1-065 嫑废话上代码

题目内容:

L1-065 嫑废话上代码 - 团体程序设计天梯赛-练习集 (pintia.cn)

解题思路:

略。

C代码展示:

#include <stdio.h>

int main()
{
	printf("Talk is cheap. Show me the code.\n");
	
	return 0;
}

L1-066 猫是液体

题目内容:

L1-066 猫是液体 - 团体程序设计天梯赛-练习集 (pintia.cn)

解题思路:

略。

C代码展示:

#include <stdio.h>

int main()
{
	int a, b, c;
	scanf("%d %d %d", &a, &b, &c);
	printf("%d\n", a*b*c);
	
	return 0;
}

L1-067 洛希极限

题目内容:

L1-067 洛希极限 - 团体程序设计天梯赛-练习集 (pintia.cn)

解题思路:

这道题其实很简单,它只是题目看着长, 但是题目中的有效信息其实很少也很集中。题目整体思路很清晰,按照题目给的规则计算洛希极限,然后在和距离做 乘或除 与 1 进行比较,对应输出就行了。

C代码展示:

#include <stdio.h>

int main()
{
	float v, a, r;
	int p;
	scanf("%f %d %f", &v, &p, &r);
	if (p == 0) a = v * 2.455;
	else a = v * 1.26;
	printf("%.2f ", a);
	if (a / r < 1) printf("^_^\n");
	else printf("T_T\n");
	
	return 0;
}

L1-068 调和平均

题目内容:

L1-068 调和平均 - 团体程序设计天梯赛-练习集 (pintia.cn)

解题思路:

按照题目要求,一步步进行计算即可。

C代码展示:

#include <stdio.h>

int main()
{
	int n;
	float sum = 0;
	scanf("%d", &n);
	for (int i=0; i<n; i++){
		float num;
		scanf("%f", &num);
		sum += 1.0 / num;
	}
	sum /= n;
	printf("%.2f\n", 1.0 / sum);
	
	return 0;
}

L1-069 胎压监测

题目内容:

解题思路:

C代码展示:

#include <stdio.h>

int main()
{
	int g[5], g_min, g_max, max=0;
	scanf("%d %d %d %d %d %d", &g[1], &g[2], &g[3], &g[4], &g_min, &g_max);
	int k=0, p=0;
	for (int i=1; i<=4; i++){
		if (max < g[i]) max = g[i];
	}
	for (int i=1; i<=4; i++){
		if (max - g[i] > g_max || g[i] < g_min){
			k++;
			p = i;
		}
	}
	if (k == 0) printf("Normal\n");
	else if(k == 1) printf("Warning: please check #%d!\n", p);
	else printf("Warning: please check all the tires!\n");
	
	return 0;
}

L1-070 吃火锅

题目内容:

L1-070 吃火锅 - 团体程序设计天梯赛-练习集 (pintia.cn)

解题思路:

读题思路很清晰,主要需要处理的只有两个点,一个是退出的判断,另一个是子串查找。

        对于第一个问题,可以使用 strcmp() 函数,当返回值为0时,退出循环。

        对于第二个问题,可以使用 strstr() 函数,用来查找子串出现的位置,当不存在该子串时,返回NULL,对于本题,我们只需要判断是否存在,即当值不为NULL时即可。

下面介绍一下这两个函数:

int strcmp(const char *str1,const char *str2);

参数:

  • str1 -- 要进行比较的第一个字符串。

  • str2 -- 要进行比较的第二个字符串。

返回值

                str1 > str2   返回大于0的值;

                str1==str2    返回等于0的值;

                str1 < str2   返回小于0的值;

char *strstr(const char *haystack, const char *needle)

参数:

  • haystack -- 要被检索的 C 字符串。

  • needle -- 在 haystack 字符串内要搜索的小字符串。

返回值:

该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。

C代码展示:

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

int main()
{
	int cnt = 0, m=0, k=0;
	char s[100];
	while(gets(s)){
		if (!strcmp(s, ".")) break; //当输入中只有一个‘ . ’时,退出。
		cnt++; //记录输入字符串数量
		if (strstr(s, "chi1 huo3 guo1") != NULL){
			if (m == 0) m = cnt; //记录第一次出现的位置
			k++; //记录出现次数
		}
	}
	printf("%d\n", cnt);
	if (k == 0) printf("-_-#");
	else printf("%d %d", m, k);
	
	return 0;
}

L1-071 前世档案

题目内容:

L1-071 前世档案 - 团体程序设计天梯赛-练习集 (pintia.cn)

解题思路:

本题其实就是一个树结构的搜索,只是它已经指定了方向。

设定两个值作为左右边界,然后当输入 ' y ' 时即走左子树,修改左边界,输入 ' n ' 时即走右子树,修改右边界。

C代码展示:

#include <stdio.h>

int main()
{
	int n, m;
	char str[50];
	scanf("%d %d", &n, &m);
	getchar(); //读取缓存区的 '\n'
	for (int i=0; i<m; i++){
		gets(str);
		int r = 0, l = (int)pow(2, n); //初始的左右边界。
		for (int j=0; j<n; j++){
			if (str[j] == 'y'){
				l = (r + l) / 2;
			}
			else{
				r = (r + l + 1) / 2;
			}
		}
		printf("%d\n", l); //最终左边界的值就是答案。
	}
	
	return 0;
}

L1-072 刮刮彩票

题目内容:

L1-072 刮刮彩票 - 团体程序设计天梯赛-练习集 (pintia.cn)

解题思路:

本题相对来说其实是容易的,它主要需要去处理的问题只有将输入时0的位置的数值换回彩票上该位置的值,其它处理都相对容易。

C代码展示:

#include <stdio.h>

int main() {
    int awk[50] = {10000, 36, 720, 360, 80, 252, 108, 72, 54, 180,
                   72, 180, 119, 36, 306, 1080, 144, 1800, 3600}; // 定义并初始化awk数组
    int num[10][10] = {0}, x=45, k, sum=0, r, l; // 定义3x3矩阵num,变量x(初始值为45),k(待输入的整数),sum(用于计算和),r和l(用于标记特定位置)

    for (int i=1; i<=3; i++) {
        for (int j=1; j<=3; j++) {
            int a;
            scanf("%d", &a); // 读取矩阵元素
            num[i][j] = a; // 存储矩阵元素
            x -= a; // 更新x的值
            if (a == 0) {
                r = i; // 标记0的位置
                l = j;
            }
        }
    }
    num[r][l] = x; // 在矩阵中放置剩余的值

    for (int i=0; i<3; i++) {
        int a, b;
        scanf("%d %d", &a, &b); // 读取查询的位置
        printf("%d\n", num[a][b]); // 输出查询位置的值
    }

    scanf("%d", &k); // 读取整数k
    if (k<=3) {
        for (int i=1; i<=3; i++) {
            sum += num[k][i]; // 计算行的和
        }
    } else if (k<=6) {
        for (int i=1; i<=3; i++) {
            sum += num[i][k-3]; // 计算列的和
        }
    } else if (k == 7) {
        for (int i=1; i<=3; i++) {
            sum += num[i][i]; // 计算对角线的和
        }
    } else {
        for (int i=1; i<=3; i++) {
            sum += num[i][4-i]; // 计算副对角线的和
        }
    }
    printf("%d\n", awk[sum - 6]); // 输出awk数组中对应位置的值

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值