PTA L1系列题解(C语言)(L1_025 -- L1_032)

L1-025 正整数A+B

题目内容:

解题思路:

本题注意点较多并且比较分散,我针对我完成时注意到的一些点来进行分享。

注意点1.A、B的值在范围 [1, 1000],需要注意 >=1000 和 == 0 的情况。

注意点2.多空格的判定,即用gets这类整行读取时需要注意判定,以及scanf的不适合单独使用。

注意点3.非数字字符的判定,这个较为容易。

C代码展示:

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

int main() {
    char A[1000], B[1000];
    int _A = 0, _B = 0, flag = 0;

    scanf("%s", A);
    gets(B);

    for (int i = 0; i < strlen(A) && flag == 0; i++) { // 遍历字符串A中的每个字符
        if ('0' <= A[i] && A[i] <= '9') {
            _A = _A * 10 + A[i] - '0'; // 将字符转换为整数并添加到_A中
        } else { 
            flag += 1; // 如果遇到非数字字符,设置标志1
        }
        if (_A > 1000 || _A == 0 && flag == 0) flag += 1;
    // 如果_A超出范围或在处理完字符串A之前发现无效输入,设置标志1
    }

    for (int i = 1; i < strlen(B) && flag <= 1; i++) { // 从第二个字符开始遍历字符串B,因为第一个字符可能不是数字
        if ('0' <= B[i] && B[i] <= '9' && _B <= 1000) { // 如果字符是数字且_B在有效范围内
            _B = _B * 10 + B[i] - '0'; // 将字符转换为整数并添加到_B中
        } else { 
            flag += 2; // 如果遇到非数字字符,设置标志2
        }
        if (_B > 1000 || _B == 0 && flag <= 1) flag += 2;
     // 如果_B超出范围或在处理完字符串B之前发现无效输入,设置标志2
    }

    if (flag == 0) { // 如果没有错误标志
        printf("%d + %d = %d\n", _A, _B, _A + _B); // 输出加法表达式的结果
    } else if (flag == 1) { // 如果只有第一个数字有错误
        printf("? + %d = ?\n", _B); // 输出包含问号的加法表达式
    } else if (flag == 2) { // 如果只有第二个数字有错误
        printf("%d + ? = ?\n", _A); // 输出包含问号的加法表达式
    } else if (flag == 3) { // 如果两个数字都有错误
        printf("? + ? = ?\n"); // 输出包含问号的加法表达式
    }

    return 0;
}

L1-026 I Love GPLT

题目内容:

解题思路:

略。

C代码展示:

#include <stdio.h>

int main()
{
	printf("I\n \nL\no\nv\ne\n \nG\nP\nL\nT\n");
	return 0;
}

L1-027 出租

题目内容:

解题思路:

本题对时间的要求较低,只要能写出来就可以,整体难度我认为不如L1-025。

我的处理方法是,使用三个数组,tell,temp,arr。tell用来存储电话号码,temp用哈希表的方式来临时记录出现过的数,arr用来记录最终的数字顺序。

C代码展示:

#include <stdio.h>

int main() {
    int tell[20], temp[20] = {0}, arr[20] = {0};
    int k = 0;

    for (int i = 0; i < 11; i++) { // 循环读取11个整数
        scanf("%1d", &tell[i]); // 读取一个整数并存储在tell数组中
        temp[tell[i]]++; // 在temp数组中,对应tell[i]的计数加1
    }

    for (int i = 9; i >= 0; i--) { // 从大到小遍历temp数组
        if (temp[i]) { // 如果temp[i]不为0,说明有数字i
            arr[k] = i; // 将数字i存储到arr数组中
            k++; // 增加arr数组的计数
        }
    }

    printf("int[] arr = new int[]{");
    for (int i = 0; i < k - 1; i++) printf("%d,", arr[i]);
    printf("%d};\n", arr[k - 1]);

    printf("int[] index = new int[]{");
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < k; j++) {
            if (tell[i] == arr[j]) printf("%d,", j);
        }
    }
    for (int j = 0; j < k; j++) {
        if (tell[10] == arr[j]) printf("%d};\n", j);
    }

    return 0;
}

L1-028 判断素数

题目内容:

解题思路:

分开处理正整数 1 和 2 ,其余数就按照正常的素数判断方法。

注意,需要用sqrt来缩短时间。

C代码展示:

#include <stdio.h>
#include <math.h>

int main()
{
	int n, a, flag = 0;
	scanf("%d", &n);
	for (int i=0; i<n; i++){
		scanf("%d", &a);
		flag = 0;
		if (a <= 1) printf("No\n");
		else if (a == 2) printf("Yes\n");
		else{
			for (int j=2; j<sqrt(a) + 1 && flag == 0; j++){
				if (a % j == 0){
					flag = 1;
				}
			}
			if (flag == 0) printf("Yes\n");
			else printf("No\n");
		}
	}
	
	return 0;
}

L1-029 是不是太胖了

题目内容:

解题思路:

略。

C代码展示:

#include <stdio.h>

int main()
{
	int H;
	scanf("%d",&H);
	printf("%.1f\n",(H-100)*0.9*2);
	return 0;
}

L1-030 一帮一

题目内容:

解题思路:

由于题目规定男女人数一样,故上半部分 的互帮对象一定会在 下半部分,按照这个思路,只需要从数组的两头进行查询即可,然后对查询过的数据的首位进行修改标记。

注意点:如果N是用scanf输入,会遗留一个 "\n" 需要用 getchar() 给它囊括掉,才会不影响后续gets()这类函数的使用。

C代码展示:

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

int main() {
    int n;
    char s[100][50] = {{0}};

    scanf("%d", &n); // 读取字符串的数量
    getchar(); // 读取并丢弃缓冲区中的换行符

    for (int i = 0; i < n; i++) gets(s[i]); // 使用gets函数读取每个字符串。

    for (int i = 0; i < n / 2; i++) { // 遍历字符串数组的前半部分
        if (s[i][0] == '0') { // 如果字符串以'0'开头
            for (int j = n; j >= n / 2; j--) { // 从后半部分的字符串开始遍历
                if (s[j][0] == '1') { // 如果找到以'1'开头的字符串
                    printf("%s %s\n", s[i] + 2, s[j] + 2); // 输出配对的字符串(跳过前两个字符)
                    s[j][0] = '2'; // 将配对成功的字符串标记为'2'
                    break; // 跳出循环
                }
            }
        } else { // 如果字符串不是以'0'开头
            for (int j = n; j >= n / 2; j--) { // 从后半部分的字符串开始遍历
                if (s[j][0] == '0') { // 如果找到以'0'开头的字符串
                    printf("%s %s\n", s[i] + 2, s[j] + 2); // 输出配对的字符串(跳过前两个字符)
                    s[j][0] = '2'; // 将配对成功的字符串标记为'2'
                    break; // 跳出循环
                }
            }
        }
    }

    return 0;
}

L1-031 到底是不是太胖了

题目内容:

解题思路:

主要是读懂题中三个分类的标准,以及整型和浮点型的转换。

建议1:对于公斤和市斤的转换可以在标准体重处进行,将公斤转换为市斤。

建议2:判断是否完美时,因为有浮点型进行运算,可以用fabs函数来取绝对值。

C代码展示:

#include <stdio.h>
#include <math.h>

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        int h, w; // 定义变量h(身高)和w(体重)
        float _bz; // 定义变量_bz,用于存储标准体重
        if (i) printf("\n"); // 如果不是第一组数据,输出一个换行符
        scanf("%d %d", &h, &w); // 读取身高和体重

        _bz = (h - 100) * 0.9 * 2; // 计算标准体重,公式为:标准体重 = (身高 - 100) * 0.9 * 2
        if (0 < w - _bz && w - _bz >= _bz * 0.1) { // 如果实际体重大于标准体重,并且差距大于等于标准体重的10%
            printf("You are tai pang le!");
        }
        if (0 < _bz - w && _bz - w >= _bz * 0.1) { // 如果实际体重小于标准体重,并且差距大于等于标准体重的10%
            printf("You are tai shou le!");
        }
        if (fabs(w - _bz) < _bz * 0.1) { // 如果实际体重与标准体重的差距小于标准体重的10%
            printf("You are wan mei!");
        }
    }

    return 0;
}

L1-032 Left-pad

题目内容:

解题思路:

本题主要分为两种情况:

        一、输入字符串长度 <= 填充结果字符串,对于这种情况,就需要先用一个循环输出填充字符,再输出字符串。

        二、输入字符串长度 > 填充结果字符串,这时就可以通过指针移动到填充字符串长度的地方,也即str + len - n。

C代码展示:

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

int main() {
    int n, len; // 定义整数变量n(用于存储用户输入的长度)和len(用于存储字符串实际长度)
    char c; // 定义字符变量c,用于存储用户输入的特定字符
    char str[100005] = {0}; // 定义一个字符数组str,用于存储输入的字符串,初始化为0

    scanf("%d %c", &n, &c); // 读取用户输入的长度和特定字符
    getchar(); // 读取并丢弃缓冲区中的换行符,为gets函数做准备
    gets(str); // 使用gets函数读取一行字符串。

    len = strlen(str); // 计算输入字符串的实际长度

    if (len <= n) { // 如果字符串长度小于或等于用户输入的长度
        for(int i = 0; i < n - len; i++) { // 循环输出特定字符,直到达到用户输入的长度
            printf("%c", c); // 输出特定字符
        }
        printf("%s\n", str); // 输出原始字符串
    } else { // 如果字符串长度超过用户输入的长度
        printf("%s\n", str + len - n); // 输出字符串的后n个字符
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值