PTA系列 L1-001 L1-002 L1-003 L1-004 L1-005 L1-006(c语言)第一天

L1-001 Hello World

分数 5   作者 陈越   单位 浙江大学

这道超级简单的题目没有任何输入。

你只需要在一行中输出著名短句“Hello World!”就可以了。

输入样例:

输出样例:

Hello World!

题解:

#include<stdio.h>
int main()
{
	printf("Hello World!");
 return 0;
}

L1-002 打印沙漏

分数 20

作者 陈越

单位 浙江大学

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

题解:

算沙漏行数那里用的是等差数列和的知识点!

#include<stdio.h>
#include<math.h>
int main()
{
	int N,i,j,m,n;
	char ch;
	scanf("%d %c",&N,&ch);
	n=sqrt((N+1)/2);    //算出沙漏一半的行数
	for(i=1;i<=n;i++)
	{
		for(m=i-1;m>0;m--)     //随着行数i的增加,空格数按照0,1,2...增加,需要打印出所有的空格,则m自减,即可打印出m个空格。
			printf(" ");
		for(j=0;j<2*(n-i)+1;j++)     //随着行数的增加,字符数按照奇数的规律减小,需要打印该行对应的奇数个字符(对j的约束)。
			printf("%c",ch);
		printf("\n");
	}
	for(i=1;i<n;i++)
	{
		for(m=1;m<n-i;m++)
			printf(" ");
		for(j=1;j<=2*i+1;j++)
			printf("%c",ch);
		printf("\n");
	}
	printf("%d\n",N-2*n*n+1);
	return 0;
}

L1-003 个位数统计

分数 15

作者 陈越

单位 浙江大学

给定一个 k 位整数 N=dk−1​10k−1+⋯+d1​101+d0​ (0≤di​≤9, i=0,⋯,k−1, dk−1​>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。

输入格式:

每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。

输出格式:

对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。

输入样例:

100311

输出样例:

0:2
1:3
3:1

 题解:

#include <stdio.h>

int main() {
    char N[1001];
    int count[10] = {0};
    // 读取输入整数
    scanf("%s", N);
    // 统计每种不同的个位数字出现的次数
    int i = 0;
    while (N[i] != '\0') {
        int digit = N[i] - '0';
        count[digit]++;
        i++;
    }
    // 输出每种不同的个位数字及其出现次数
    for (int j = 0; j < 10; j++) {
        if (count[j] > 0) {
            printf("%d:%d\n", j, count[j]);
        }
    }
    return 0;
}

L1-004 计算摄氏温度

分数 5

作者 陈建海

单位 浙江大学

给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。

输入格式:

输入在一行中给出一个华氏温度。

输出格式:

在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。

输入样例:

150

输出样例:

Celsius = 65

题解:

#include<stdio.h>
int main()
{
	int C,F;
	scanf("%d",&F);
	C=5*(F-32)/9;
	printf("Celsius = %d",C);
	return 0;
}

L1-005 考试座位号

分数 15

作者 陈越

单位 浙江大学

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式:

输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。其中准考证号由 16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。

输出格式:

对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。

输入样例:

4
3310120150912233 2 4
3310120150912119 4 1
3310120150912126 1 3
3310120150912002 3 2
2
3 4

输出样例:

3310120150912002 2
3310120150912119 1

题解:

#include <stdio.h>

typedef struct {
    char id[17];
    int test_seat;
    int seat;
} Student;

int main() {
    int N, M;
    scanf("%d", &N);
    Student students[N];
    for (int i = 0; i < N; i++) {
        scanf("%s %d %d", students[i].id, &students[i].test_seat, &students[i].seat);
    }
    scanf("%d", &M);
    int query_seats[M];
    for (int i = 0; i < M; i++) {
        scanf("%d", &query_seats[i]);
    }
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            if (students[j].test_seat == query_seats[i]) {
                printf("%s %d\n", students[j].id, students[j].seat);
                break;
            }
        }
    }
    return 0;
}

L1-006 连续因子

分数 20

作者 陈越

单位 浙江大学

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数 N(1<N<231)。

输出格式:

首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630

输出样例:

3
5*6*7

题解:

1、思路

(1)易错点分析

 1.题目要求 N( 1 < N <231),所以数据类型为 long long int。
 2.注意这里求的是连续因子,很多人的想法就是:我把这个数的所有因子都求解出来,然后放进一 个数组里,只需要判断是不是连续即可,这样有一个很严重的问题,例如当 N = 1680 时,其因子为 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 20,21, 24, 28, 30, 35, 40, 42, 48, 56, 60, 70, 80, 84, 105, 112, 120,140, 168, 210, 240, 280, 336, 420, 560, 840, 1680通过这组数据,我们不难发现,貌似连续因子为 2, 3, 4, 5, 6, 7, 8,但实际上我们会发现 2 * 3 * 4 * 5 * 6 * 7 * 8 = 40320 >1680,超过 1680 了。
    实际上 1680 = 2 * 3 * 4 * 5 * 7 * 2,它的连续因子仅为 2, 3, 4, 5,所以我们在计算的时候需要考虑所求连续因子的积 num <= N。
 3.最后,我们要注意判断 N 是不是质数,如果是质数,其只有 1 和 N 两个因子,要注意同时输出。

(2)思路

1.对于求一个数的因子,首先从 2 开始遍历,直到 √N 结束。
2.然后我们开始求连续因子,用 num 表示因子之积,count 表示连续因子的个数,从当前的数 i 开始遍历,循环继续的条件为 N % (num * j) == 0,这个不仅仅是判断下一个数是否为因子,更重要的是可以判断 num 是否大于 N,一举两得,有效的避免的易错点 2。
3.最后就是需要判断 N 是否为素数。

代码:

#include<stdio.h>
#include<math.h>
int main()
{
    long long int N, i, j, num, count, start = 0, max = 0;
    scanf("%lld", &N);
    for (i = 2; i < sqrt(N); i++)
    {
        num = 1;
        count = 0;
        for (j = i; N % (num * j) == 0; j++)
        {
            count++;
            num *= j;
        }
        if (count > max)
        {
            start = i;
            max = count;
        }
    }
    if (max == 0)
    {
        printf("1\n");
        printf("%lld\n", N);
    }
    else
    {
        printf("%lld\n", max);
        for (i = start; i < start + max - 1; i++)
        {
            printf("%lld*", i);
        }
        printf("%lld\n", i);
    }
    return 0;
}

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值