PTA L1系列题解(C语言)(L1_001 -- L1_008)

L1-001 个位数统计

题目内容:

解题思路:

C代码展示:

#include <stdio.h>

int main()
{
	printf("Hello World!");
	
	return 0;
}

L1-002 打印沙漏

题目内容:

解题思路:

        题目要求打印一个“沙漏”,我们可以将该形状由中间分开,以下方为例,每一行的数量满足等差数列,而 整体打印个数 = 2 * “一半” - 1,以上是题目的初步了解。

        第一步,我们需要计算出“一半”有多少行,另一半就可以类比得出。可以通过循环,当退出该循环时,i - 1即为需要打印的“一半”的行数。

for (i=1; 2 * i * i - 1 <= N; i++);

        第二步,打印符号前的空格,以及该符号。空格为一个公差为1的等差数列,符号为一个公差为2的等差数列。

        第三步,计算剩余符号数量,这一步可以和第一步同时得出。

C代码展示:

​
#include <stdio.h>

int main()
{
    int N, i=1, m;
    char a;
    scanf("%d %c", &N, &a);

    // 计算帕斯卡三角形的行数,直到2*i*i-1大于N
    for (; 2 * i * i - 1 <= N; i++);
    i--; // 因为上面的循环会多增加1,所以这里减去1来得到正确的行数

    m = N - 2 * i * i + 1; // 计算最后输出的整数m

    // 打印帕斯卡三角形的上半部分
    for(int j = 0; j<i-1; j++){
        for (int k=j; k>0; k--) {
            printf(" "); // 打印空格,形成三角形的对称结构
        }
        for (int k = 2 * (i - j) - 1; k>0; k--){
            printf("%c", a); // 打印字符a,形成三角形的边缘
        }
        printf("\n");
    }

    // 打印帕斯卡三角形的下半部分,包括中间的数字
    for(int j = i-1; j>=0; j--){
        for (int k=j; k>0; k--) {
            printf(" "); // 打印空格
        }
        for (int k = 2 * (i - j) - 1; k>0; k--){
            printf("%c", a); // 打印字符a
        }
        printf("\n");
    }

    printf("%d\n", m);
    return 0;
}

​

L1-003 个位数统计

题目内容:

解题思路:

注意点:题目中所输入的正整数N已经超出 ing 或者 long long int 所能容纳的长度,应该用整形数组进行存储。

        第一步,可以定义一个哈希表,进行存储每个数字出现的次数。

        第二步,循环遍历哈希表,当该位置的数值不为零时输出。

C代码展示:

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

int main()
{
    char s[1005];
    int cnt[10] = {0}; // 定义一个整型数组cnt,用于存储0-9每个数字出现的次数,初始值都为0

    scanf("%s", s);

    for (int i=0; i<strlen(s); i++) {
        cnt[s[i] - '0'] ++; // 将字符转换为数字,并在cnt数组中对应的位置增加计数
    }

    for (int i=0; i<10; i++) {
        if (cnt[i] != 0) { // 如果某个数字的计数不为0
            printf("%d:%d\n", i, cnt[i]); // 输出该数字及其计数
        }
    }

    return 0;
}

​

L1-004 计算摄氏温度

题目内容:

解题思路:

略。

C语言代码展示:

#include <stdio.h>

int main()
{
	int F, C;
	scanf("%d", &F);
	C=5*(F-32)/9;
	printf("Celsius = %d\n", C);
	
	return 0;
}

L1-005 考试座位号

题目内容:

解题思路:

        本题使用结构体相对容易,或者可以使用二维的长整型数组。本题难点在于输入的存储,后续判断输出都相对简单。

C语言代码展示:

​//使用结构体
#include <stdio.h>

typedef struct student { // 定义一个名为student的结构体,用于存储学生信息
    char s[20]; // 学生名字
    int a; // 学校编号
    int b; // 成绩
} student;

int main() {
    int N, M, sch; // 定义整数N(学生数量),M(查询数量),sch(学校编号)
    student x[1005]; // 定义一个学生结构体数组x,最多存储1005个学生信息

    scanf("%d", &N); // 从标准输入读取学生数量
    for (int i = 0; i < N; i++) { // 循环读取每个学生的信息
        scanf("%s %d %d", x[i].s, &x[i].a, &x[i].b); // 读取学生的名字、学校编号和成绩
    }

    scanf("%d", &M); // 从标准输入读取查询数量
    for (int i = 0; i < M; i++) { // 循环处理每个查询
        scanf("%d", &sch); // 读取学校编号
        for (int j = 0; j < N; j++) { // 遍历所有学生信息
            if (x[j].a == sch) { // 如果学生所在的学校编号与查询的学校编号相同
                printf("%s %d\n", x[j].s, x[j].b); // 输出学生的名字和成绩
            }
        }
    }

    return 0;
}

​
//使用二位长整型数组
#include<stdio.h>
int main()
{
    int N,M;
    scanf("%d",&N);
    long long a[N][3];
    int i,j,k;
    for(i=0;i<N;i++)
    {
        scanf("%lld %lld %lld",&a[i][0],&a[i][1],&a[i][2]);
    }
    scanf("%d",&M);
    int b[M];
    for(i=0;i<M;i++)
    {
        scanf("%d",&b[i]);
    }
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
        {
            if(a[j][1]==b[i])
            {
                printf("%lld %lld",a[j][0],a[j][2]);
                printf("\n");
                continue;
            }
        }
    }
}

L1-006 连续因子

题目内容:

解题思路:

重点:无论该数除了多少个数,总还有有一个数能够把它除尽,即只需找出最长能被除的连续因子即可,不用关心商的值。

        第一步,求出该数所有因子,大于 根号下该数 的因子长度最长就为1,故可以只求 根号下该数 。

        第二步,判断该数是否为质数,若为质数即输出 “1\n” ,若不是则进行下一步。

        第三步,写一个双重循环,来寻找最长连续因子。

C语言代码展示:

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

int prime(int n) {
    for (int i = 2; i <= sqrt(n); i++) { // 遍历从2到sqrt(n)的整数
        if (n % i == 0) return 0; // 如果n能被i整除,则n不是质数,返回0
    }
    return 1; // 如果没有找到能整除n的i,则n是质数,返回1
}

int main() {
    int N, k = 1, len = 0, i, j, s = 1, start = 1;
    scanf("%d", &N);
    if (prime(N)) {
        printf("1\n%d\n", N); // 如果是质数,输出1和N
    } else {
        for (i = 2; i <= sqrt(N); i++) {
            s = 1;
            for (j = i; s * j <= N; j++) { // 从i开始,尝试构建乘积序列
                s *= j; // 将当前整数j加入乘积序列
                if (N % s == 0 && len < j - i + 1) { // 如果s能整除N,并且序列长度大于当前最长序列
                    len = j - i + 1; // 更新序列长度
                    start = i; // 更新序列起始位置
                }
            }
        }
        printf("%d\n", len);
        for (i = start; i < start + len - 1; i++) { // 遍历序列,打印序列中的每个整数
            printf("%d*", i);
        }
        printf("%d\n", i);
    }
    return 0;
}

L1-007 念数字

题目内容:

解题思路:

可以定义一个二维字符数组,用来记录所有拼音,方便后续输出。

C语言代码展示:

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

int main() {
    char s[15][10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
    // 定义一个二维字符数组,用于存储中文数字的读音
    char x[1000];
    gets(x); // 使用gets函数读取一行输入,存储到x中。

    for (int i = 0; i < strlen(x) - 1; i++) { 
    // 遍历字符串x中的每个字符,直到倒数第二个字符
        if (x[i] == '-') { // 如果字符是'-',则输出"fu "
            printf("fu ");
        } else {
            printf("%s ", s[x[i] - '0']); 
    // 否则,根据字符的ASCII值减去'0'的ASCII值,作为索引输出对应的中文数字
        }
    }
    printf("%s\n", s[x[strlen(x) - 1] - '0']);
    // 输出字符串x的最后一个字符对应的中文数字,并换行

    return 0;
}

​

L1-008 求整数段和

题目内容:

解题思路:

难点1:每个数字输出占五个字符宽度,可以使用 "%5d"。

难点2:每行只输出5个数字,可以定义一个变量来记录该行输出的个数。

C语言代码展示:

#include <stdio.h>

int main() {
    int a, b, k=0, sum=0;
    scanf("%d %d", &a, &b);

    for (int i = a; i <= b; i++) {
        printf("%5d", i); // 打印当前整数i,占位宽度为5
        k++; // 计数器k增加1
        sum += i; // 将当前整数i加到sum上
        if (k == 5) { // 如果计数器k达到5,重置计数器,并换行
            k = 0;
            printf("\n");
        }
    }
    if ((b - a + 1) % 5 != 0) printf("\n"); // 如果最后不足5个数,也输出一个换行符
    printf("Sum = %d\n", sum);
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值