PTA L1系列题解(C语言)(L1_033 -- L1_040)

L1-033 出生年

题目内容:

解题思路:

注意点1:不同的数字个数 不能多不能少

注意点2:输出的年份占四格。

按照这两个注意点,我提供一下我的思路。

首先针对第一点,我的处理方法是设置一个flag,然后让它每遇到一个不同的数字都自减,然后在这个思路的基础上,加入了哈希表,遍历哈希表,当值大于1时,也即出现次数多于一次时,flag -= a[i] - 1。

然后对于不能多和不能少的判定就是flag == 0,然后输出年份占四个也就是%04d。

C代码展示:

#include <stdio.h>

int main() {
    int y, n, cnt = 0;
    scanf("%d %d", &y, &n); // 读取起始数字和要找到的满足条件的数字的序号

    for ( ; ; y++, cnt++) { // 无限循环,每次循环y增加1,计数器cnt也增加1
        int a[10] = {0}; // 定义数组a,用于存储每个数字(0-9)在y中出现的次数,初始化为0
        int flag = 4 - n; // 定义变量flag,用于判断是否满足条件,初始化为4-n

        for (int temp = y, i = 0; i < 4; temp /= 10, i++) { // 遍历数字y的每一位,只遍历4位
            a[temp % 10]++; // 增加数组a中对应数字的出现次数
        }

        for (int i = 0; i < 10; i++) { // 遍历数组a
            if (a[i] > 1) flag -= a[i] - 1; // 如果某个数字出现超过一次,则flag减去多余的次数
        }

        if (flag == 0) { // 如果flag等于0,说明找到了满足条件的数字
            printf("%d %04d\n", cnt, y); // 数字y格式化为4位,不足前面补0
            break;
        }
    }

    return 0;
}

L1-034 点赞

题目内容:

解题思路:

由于标签的界限是从1到1000,整体数量并不多,故我采取了哈希表的方式。

然后,为了节约时间复杂度,我在每次自增时加入与最大值的判定,避免最后再进行一次循环,找次数最多的。

C代码展示:

#include <stdio.h>

int main() {
    int n, ff, max = 0, cnt[1005] = {0};
// 定义变量n(组数),ff(出现次数最多的数字),max(出现次数),
    cnt数组(用于存储每个数字的出现次数)

    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        int k;
        scanf("%d", &k); // 读取每组中的数字数量
        for (int j = 0; j < k; j++) { // 遍历每组中的每个数字
            int a; // 定义变量a,用于存储当前读取的数字
            scanf("%d", &a); // 读取当前数字
            cnt[a]++; // 增加数组cnt中对应数字的出现次数
            if (max < cnt[a]) { // 如果当前数字的出现次数大于已知的最大出现次数
                max = cnt[a]; // 更新最大出现次数
                ff = a; // 更新出现次数最多的数字
            }
            else if (max == cnt[a]) { // 如果当前数字的出现次数等于已知的最大出现次数
                if (ff < a) { // 如果已知的出现次数最多的数字大于当前数字
                    max = cnt[a]; // 更新最大出现次数
                    ff = a; // 更新出现次数最多的数字
                }
            }
        }
    }
    printf("%d %d\n", ff, max);

    return 0;
}

L1-035 情人节

题目内容:

解题思路:

用一个循环进行输入,都存入二维数组s中,一直判定到输入为 “ . ”。

跳出循环后,判定循环自增量i,按照题目需求分为三种情况,按照需求输出即可。

C代码展示:

#include <stdio.h>

int main()
{
	int i=0;
	char s[10000][100];
	for (i=1;;i++)
	{
		gets(s[i]);
		if (s[i][0]=='.') break;
	}
	i--;
	if (i>=14)
		printf("%s and %s are inviting you to dinner...\n",s[2],s[14]);
	else if(i>=2)
		printf("%s is the only one for you...\n",s[2]);
	else
		printf("Momo... No one is for you ...\n");
	return 0;
}

L1-036 A乘以B

题目内容:

解题思路:

略。

C代码展示:

#include <stdio.h>

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

L1-037 A除以B

题目内容:

解题思路:

题目表示,按照分母划分为三种情况:
        分母   >   0 :直接输出。

        分母  ==  0 :输出分子,分母,结果变为Error。

        分母   <   0 :在分母上加个括号。

C代码展示:

#include <stdio.h>

int main() {
    int a, b;
    scanf("%d %d", &a, &b);

    if (b > 0) { // 如果除数b是正数
        printf("%d/%d=%.2f\n", a, b, 1.0 * a / b); // 输出除法结果,保留两位小数
    } else if (b == 0) { // 如果除数b是零
        printf("%d/%d=Error\n", a, b); // 输出错误信息
    } else { // 如果除数b是负数
        printf("%d/(%d)=%.2f", a, b, 1.0 * a / b); // 输出除法结果,并将负数标记在括号内,保留两位小数
    }

    return 0;
}

L1-038 新世界

题目内容:

解题思路:

略。

C代码展示:

#include <stdio.h>

int main()
{
	printf("Hello World\nHello New World\n");
	return 0;
}

L1-039 古风排版

题目内容:

解题思路:

题目整体思路分为两层,第一层是判断字符串会按照n划分为几列,第二层为按照古风格式输出。

难点在于第二步,而它主要面临的是两个问题,第一个问题是,它输出的字符在字符串的哪个位置,第二个问题是,最后一列不满的情况输出空格。

对于第一个问题,我的计算方式是 r * j + i ,就相当于将字符串分为了r段,然后每一次输出每一段的同一部分。对于第二个问题,其实就是按照上面的计算方式,如果数值大于了字符串的长度,则输出空格即可。

C代码展示:

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

int main() {
    int l, r, x; // 定义变量l(每行的长度),r(列数),x(剩余字符数)
    char s[1005]; // 定义字符数组s,用于存储输入的字符串

    scanf("%d", &r); // 读取列数
    getchar(); // 读取并丢弃缓冲区中的换行符,为gets函数做准备
    gets(s); // 使用gets函数读取一行字符串。

    l = strlen(s) / r; // 计算每行的长度
    x = strlen(s) % r; // 计算剩余字符数
    if (x > 0) l++; // 如果有剩余字符,增加一行的长度

    for (int i = 0; i < r; i++) { // 遍历每一列
        for (int j = l - 1; j >= 0; j--) { // 从最后一行开始向上遍历
            int index = r * j + i; // 计算当前字符的索引
            if (index >= strlen(s)) { // 如果索引超出字符串长度,打印空格
                printf(" ");
            } else { // 否则,打印字符
                printf("%c", s[index]);
            }
        }
        printf("\n");
    }
    return 0;
}

L1-040 最佳情侣身高差

题目内容:

解题思路:

本题主要难点在于,%c它会读\n,所以在每一次输入之前需要把\n给读掉。或者可以使用getchar()函数,对于本题的读取会更加清晰一些。

C代码展示:

#include <stdio.h>

int main()
{
	int n;
	scanf("%d", &n);
	for (int i=0; i<n; i++){
		char x;
		float h;
		scanf("\n%c %f", &x, &h); //每次输入时,在缓存区都还有一个\n,故需要吃掉\n。
		if (x == 'M') printf("%.2f\n", h / 1.09);
		else printf("%.2f\n", h * 1.09);
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值