PTA练习题

本文介绍了多个编程题目,包括密码合法性检查、数字替换、格式转换、强迫症排序、降价提醒、成绩输出、乘法口诀、整除判断、英文单词排序和等腰三角形输出。每个题目详细说明了输入输出格式和样例,并提供了相应的代码实现。
摘要由CSDN通过智能技术生成

目录

第一题(检查密码)

输入格式:

输出格式:

输入样例:

输出样例:

代码

第二题(6翻了)

输入格式:

输出格式:

输入样例:

输出样例:

代码

第四题(强迫症)

输入格式:

输出格式:

输入样例 1:

输出样例 1:

输入样例 2:

输出样例 2:

输入样例 3:

输出样例 3:

代码

第五题(降价提醒机器人)

输入格式:

输出格式:

输入样例:

输出样例:

代码

第六题(输出学生成绩)

输入格式:

输出格式:

输入样例:

输出样例:

代码

第七题(乘法口诀数列)

输入格式:

输出格式:

输入样例:

输出样例:

样例解释:

代码

第八题(整除光棍)

输入格式:

输出格式:

输入样例:

输出样例:

代码

第九题(英文单词排序)

输入格式:

输出格式:

输入样例:

输出样例:

代码

第十题(输出等腰杨辉三角)

输出格式:

输出样例:

代码


第一题(检查密码)

本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点 .,还必须既有字母也有数字。

输入格式:

输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行给出一个用户设置的密码,为不超过 80 个字符的非空字符串,以回车结束。

注意: 题目保证不存在只有小数点的输入。

输出格式:

对每个用户的密码,在一行中输出系统反馈信息,分以下5种:

  • 如果密码合法,输出Your password is wan mei.
  • 如果密码太短,不论合法与否,都输出Your password is tai duan le.
  • 如果密码长度合法,但存在不合法字符,则输出Your password is tai luan le.
  • 如果密码长度合法,但只有字母没有数字,则输出Your password needs shu zi.
  • 如果密码长度合法,但只有数字没有字母,则输出Your password needs zi mu.

输入样例:

5
123s
zheshi.wodepw
1234.5678
WanMei23333
pass*word.6

输出样例:

Your password is tai duan le.
Your password needs shu zi.
Your password needs zi mu.
Your password is wan mei.
Your password is tai luan le.

代码


#include<stdio.h>
#include<string.h>
int judge_regular_ch(char arr[],int sz)
{
    for(int i=0;i<sz;i++)
    {
        //如果遍历的字符中不在题目的范围之内则返回1
        if(!((arr[i]<='Z'&&arr[i]>='A')||(arr[i]<='z'&&arr[i]>='a')||
           (arr[i]<='9'&&arr[i]>='0')||(arr[i]=='.')))
            return 1;
    }
    return 0;
}
int judge_number(char arr[],int sz)
{
    for(int i=0;i<sz;i++)
    {
        if((arr[i]<='9')&&(arr[i]>='0'))
            return 0;
    }
    return 1;
}
int judge_alphabet(char arr[],int sz)
{
    for(int i=0;i<sz;i++)
    {
        if((arr[i]<='Z'&&arr[i]>='A')||(arr[i]<='z'&&arr[i]>='a'))
            return 0;
    }
    return 1;
}
int main()
{
    int N=0;
    scanf("%d",&N);
    getchar();
    while(N--)
    {
        char arr[81];
        gets(arr);
        int len=strlen(arr);
        //判断长度的合法性
        if(len<6)
        {
            printf("Your password is tai duan le.\n");
            continue;
        }
        //判断字符的合法性
        else if(judge_regular_ch(arr,len)==1)
        {
            printf("Your password is tai luan le.\n");
            continue;
        }
        //判断是否存在数字
        else if(judge_number(arr,len)==1)
        {
            printf("Your password needs shu zi.\n");
            continue;
        }
        //判断是否存在字母
        else if(judge_alphabet(arr,len)==1)
        {
            printf("Your password needs zi mu.\n");
            continue;
        }
        else
        {
            printf("Your password is wan mei.\n");
        }
        
    }
    return 0;
}

第二题(6翻了)

“666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字“27”,因为这是 3 个 “9”!

本题就请你编写程序,将那些过时的、只会用一连串“6666……6”表达仰慕的句子,翻译成最新的高级表达。

输入格式:

输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。

输出格式:

从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。

输入样例:

it is so 666 really 6666 what else can I say 6666666666

输出样例:

it is so 666 really 9 what else can I say 27

代码

#include<stdio.h>
void combine_str(const char* str1,const char* str2,char* new_str)
{
    while(*new_str++=*str1++)
    {
        ;
    }
    new_str--;
    while(*new_str++=*str2++)
    {
        ;
    }
    
}
int main()
{
    char str1[41];
    char str2[41];
    char new_str[81];
    gets(str1);
    gets(str2);
//     scanf("%s",str1);
//     scanf("%s",str2);
    combine_str(str1,str2,new_str);
    printf("%s\n",new_str);
    return 0;
}

第四题(强迫症)

小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写 199808,有的人只写 9808。有强迫症的小强请你写个程序,把所有人的出生年月都整理成 年年年年-月月 格式。对于那些只写了年份后两位的信息,我们默认小于 22 都是 20 开头的,其他都是 19 开头的。

输入格式:

输入在一行中给出一个出生年月,为一个 6 位或者 4 位数,题目保证是 1000 年 1 月到 2021 年 12 月之间的合法年月。

输出格式:

在一行中按标准格式 年年年年-月月 将输入的信息整理输出。

输入样例 1:

9808

输出样例 1:

1998-08

输入样例 2:

0510

输出样例 2:

2005-10

输入样例 3:

196711

输出样例 3:

1967-11

代码

#include<stdio.h>
int main()
{
    int birth=0;
    scanf("%d",&birth);
    if(birth>10000)
    {
        if(birth%100>=10)
            printf("%d-%d",birth/100,birth%100);
        else
            printf("%d-0%d",birth/100,birth%100);
    }
    else
    {
        if(birth/100<22)
        {
            if(birth/100<10)
            {
                if(birth%100>=10)
                    printf("200%d-%d",birth/100,birth%100);
                else
                    printf("200%d-0%d",birth/100,birth%100);
            }
            else
            {
                if(birth%100>=10)
                    printf("20%d-%d",birth/100,birth%100);
                else
                    printf("20%d-0%d",birth/100,birth%100);
            }
            
        }
        else
        {
            if(birth%100>=10)
                printf("19%d-%d",birth/100,birth%100);
            else
                printf("19%d-0%d",birth/100,birth%100);
        }
    }
    return 0;
}

第五题(降价提醒机器人)

小 T 想买一个玩具很久了,但价格有些高,他打算等便宜些再买。但天天盯着购物网站很麻烦,请你帮小 T 写一个降价提醒机器人,当玩具的当前价格比他设定的价格便宜时发出提醒。

输入格式:

输入第一行是两个正整数 N 和 M (1≤N≤100,0≤M≤1000),表示有 N 条价格记录,小 T 设置的价格为 M。

接下来 N 行,每行有一个实数 Pi​(−1000.0<Pi​<1000.0),表示一条价格记录。

输出格式:

对每一条比设定价格 M 便宜的价格记录 P,在一行中输出 On Sale! P,其中 P 输出到小数点后 1 位。

输入样例:

4 99
98.0
97.0
100.2
98.9

输出样例:

On Sale! 98.0
On Sale! 97.0
On Sale! 98.9

代码

#include<stdio.h>
int main()
{
    int N=0;
    int M=0;
    scanf("%d %d",&N,&M);
    while(N--)
    {
        double p=0;
        scanf("%lf",&p);
        if(p<M)
        {
            printf("On Sale! %.1lf\n",p);
        }
    }
    return 0;
}

第六题(输出学生成绩)

本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。

输入格式:

输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩,数字间以空格分隔。

输出格式:

按照以下格式输出:

average = 平均成绩
max = 最高成绩
min = 最低成绩

结果均保留两位小数。

输入样例:

3
85 90 95

输出样例:

average = 90.00
max = 95.00
min = 85.00

代码

#include<stdio.h>
int main()
{
    int N=0;
    double sum=0;
    double max=0;
    double min=101;
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        double ret=0;
        scanf("%lf",&ret);
        max=max<ret?ret:max;
        min=min>ret?ret:min;
        sum+=ret;
    }
    printf("average = %.2lf\n",sum/N);
    printf("max = %.2lf\n",max);
    printf("min = %.2lf\n",min);
    return 0;
}

第七题(乘法口诀数列)

本题要求你从任意给定的两个 1 位数字 a1​ 和 a2​ 开始,用乘法口诀生成一个数列 {an​},规则为从 a1​ 开始顺次进行,每次将当前数字与后面一个数字相乘,将结果贴在数列末尾。如果结果不是 1 位数,则其每一位都应成为数列的一项。

输入格式:

输入在一行中给出 3 个整数,依次为 a1​、a2​ 和 n,满足 0≤a1​,a2​≤9,0<n≤103。

输出格式:

在一行中输出数列的前 n 项。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

2 3 10

输出样例:

2 3 6 1 8 6 8 4 8 4

样例解释:

数列前 2 项为 2 和 3。从 2 开始,因为 2×3=6,所以第 3 项是 6。因为 3×6=18,所以第 4、5 项分别是 1、8。依次类推…… 最后因为第 6 项有 6×8=48,对应第 10、11 项应该是 4、8。而因为只要求输出前 10 项,所以在输出 4 后结束。

代码

#include<stdio.h>
int main()
{
    int a1=0;
    int a2=0;
    int arr[1005]={0};//定义数组存放将要输出的所有数
    int max=0;
    scanf("%d %d %d",&a1,&a2,&max);
    //前两项固定直接赋值
    arr[0]=a1;
    arr[1]=a2;
    int i=2;
    int k=2;
    while(i<max)
    {
        int ret=arr[k-2]*arr[k-1];
        //乘积两位数时
        if(ret>9)
        {
            arr[i]=ret/10;
            arr[i+1]=ret%10;
            i+=2;
        }
        else
        {
            arr[i]=ret;
            i++;
        }
        k++;
    }
    for(int i=0;i<max;i++)
    {
        if(i!=max-1)
            printf("%d ",arr[i]);
        else
            printf("%d",arr[i]);
    }
    
}

第八题(整除光棍)

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:

输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:

在一行中输出相应的最小的sn,其间以1个空格分隔。

输入样例:

31

输出样例:

3584229390681 15

代码

#include<stdio.h>
int main()
{
    int x=0;
    int s=0;
    int count=0;
    scanf("%d",&x);
    while(s<x)
    {
        s=s*10+1;
        count++;
    }
    while(1)
    {
        printf("%d",s/x);
        s=s%x;
        if(s==0)
        {
            break;
        }
        s=s*10+1;
        count++;
        
    }
    printf(" %d",count);
}

第九题(英文单词排序)

本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。

输入格式:

输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。

输出格式:

输出为排序后的结果,每个单词后面都额外输出一个空格。

输入样例:

blue
red
yellow
green
purple
#

输出样例:

red blue green yellow purple 

代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    char arr[21][11] = {0};
    int i = 0;
    while (1)
    {
        scanf("%s", &arr[i][0]);
        if (strcmp(arr[i], "#") == 0)
        {
            break;
        }
        i++;
    }
    //qsort(arr, i, sizeof(arr[0][11]), cmp1);
    //运用冒泡排序利用字符串长度进行排序
    for (int k = 0; k < i - 1; k++)
    {
        for (int j = 0; j < i - 1 - k; j++)
        {
            if (strlen(arr[j]) > strlen(arr[j + 1]))
            {
                //交换每一个字符
                for (int m = 0; m < 11; m++)
                {
                    char ret = arr[j][m];
                    arr[j][m] = arr[j + 1][m];
                    arr[j + 1][m] = ret;

                }
            }
        }
    }
    for (int j = 0; j < i; j++)
    {
        printf("%s ", arr[j]);
    }
    return 0;
}

第十题(输出等腰杨辉三角)

输出6行等腰杨辉三角形。

输出格式:

第一行的1前面有13个空格;第2行的第一个1前面有11个空格,两个1之间有3个空格;最后一行的第一个1前面有3个空格。可以考虑每个数输出占4列列宽。

输出样例:

           1
         1   1
       1   2   1
     1   3   3   1
   1   4   6   4   1
 1   5   10  10  5   1

代码

#include<stdio.h>
int main()
{
	int Pat[10][10] = { 0 };
	int max = 6;
	//对杨辉三角赋值
	for (int i = 0; i < max; i++)
	{
		for (int j = 0; j <= i; j++)
		{
			if ((j == 0) || (j == i))
			{
				Pat[i][j] = 1;
			}
			else
			{
				Pat[i][j] = Pat[i - 1][j - 1] + Pat[i - 1][j];
			}
		}
	}
	//打印杨辉三角
	for (int i = 0; i < max; i++)
	{
		for (int j = 10-2*i; j > 0; j--)
		{
			printf(" ");
		}
		for (int j = 0; j <= i; j++)
		{
			printf("%4d", Pat[i][j]);
		}
//         if(i!=max-1)
		    printf("\n");
	}
	return 0;
}

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值