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;
}