PTA 程序设计天梯赛(41~60题)

Posted 王睿丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PTA 程序设计天梯赛(41~60题)相关的知识,希望对你有一定的参考价值。

制作不易,喜欢请点个赞,我是王睿,很高兴认识大家!

41、整除光棍 (20 分)

L1-046 整除光棍 (20 分)
这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由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)。

输出格式:
在一行中输出相应的最小的s和n,其间以1个空格分隔。

输入样例:
31
输出样例:
3584229390681 15

#include<stdio.h>  
int main ()
 {  
    int n, len=0,p=0,now=1;  
    char ans[1000];  
    scanf("%d",&n);  
    while (!0)
{  
   len++;                 //1,11,111,111....尝试能不能整除 
        if(p||now/n)          //商第一位是0时,不输出,p==0,保证了第一位,不让不止第一位不输出0了   
        ans[p++]='0'+now/n;   //保存商,转化为字符   
        now%=n;               //取余数是模拟除法的关键之1 
        if(now==0) 
{                   //余数是0,说明能整除了   
            ans[p]='\\0'; //由自己一步一步建的字符串要加上字符串结束符   
            printf("%s %d\\n", ans, len);  
            break;  
        }  
        now=now*10+1; //乘10是模拟除法的关键之2  
    }  
    return 0;  
}

42、 装睡 (10 分)

L1-047 装睡 (10 分)
你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们中间有可能在装睡的人,即至少一项指标不在正常范围内的人。

输入格式:
输入在第一行给出一个正整数N(≤10)。随后N行,每行给出一个人的名字(仅由英文字母组成的、长度不超过3个字符的串)、其呼吸频率和脉搏(均为不超过100的正整数)。

输出格式:
按照输入顺序检查每个人,如果其至少一项指标不在正常范围内,则输出其名字,每个名字占一行。

输入样例:
4
Amy 15 70
Tom 14 60
Joe 18 50
Zoe 21 71
输出样例:
Tom
Zoe

#include<stdio.h>
int main(void)
{
	int N;	//输入一个正整数
	scanf("%d",&N);
	char name[8][4];	//名字      //这里一定要注意多设一位
	int huxi[8];		//呼吸频率
	int maibo[8];		//脉搏
	int i;				//用于循环和数组下标
	for(i=0;i<N;i++)	//提供输入功能
		scanf("%s%d%d",&name[i][0],&huxi[i],&maibo[i]);
	for(i=0;i<N;i++)
		if(huxi[i]<15 || huxi[i]>20 || maibo[i]<50 || maibo[i]>70)
			puts(name[i]);
}

43、矩阵A乘以B (15 分)

L1-048 矩阵A乘以B (15 分)
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有R
​a
​​ 行、C
​a
​​ 列,B有R
​b
​​ 行、C
​b
​​ 列,则只有C
​a
​​ 与R
​b
​​ 相等时,两个矩阵才能相乘。

输入格式:
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

输出格式:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。

输入样例1:
2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
输出样例1:
2 4
20 22 24 16
53 58 63 28
输入样例2:
3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
输出样例2:
Error: 2 != 3

#include<stdio.h>
#define N 100
#define M 100
int main()
{
	int a[N][M]={0},b[N][M]={0},c[N][M]={0};
	int i,j,k;				//用于循环和数组下标
	int ra,ca,rb,cb,rc,cc;	//分别表示矩形A的行和列、矩形B的行和列、矩形C的行和列
	int n;					//
	scanf("%d %d",&ra,&ca);
	for(i=0;i<ra;i++)	//矩形A
		for(j=0;j<ca;j++)
			scanf("%d",&a[i][j]);
	scanf("%d %d",&rb,&cb);

	for(i=0;i<rb;i++)	//矩形B
		for(j=0;j<cb;j++)
			scanf("%d",&b[i][j]);
	if(ca == rb)
	{	//注意,因为咱们是将要两个矩形相乘,那么可以肯定是这两个长相不一样的矩形,
		//当一样的条件被我们判断了之后另两个条件将是决定矩形C的行列标准,所以
		//这里咱们应该要将矩形A的行和矩形B的列综合起来作为矩形C的形状,从而参与计算

		rc = ra;	//这里将矩形A的行作为矩形C的行
		cc = cb;	//这里将矩形B的列作为矩形C的列
		n = ca;		//这里是决定k循环的因素
		printf("%d %d\\n",rc,cc);
		for(i=0;i<rc;i++)		//控制行数
		{
			for(j=0;j<cc;j++)	//控制列数
			{
				for(k=0;k<n;k++)	//求出矩形A里第一行的元素分别乘以矩形b第一列的元素,求总和输出
				{					//以此类推
					c[i][j]+=a[i][k]*b[k][j];
				}
				if(j!=cc-1)
					printf("%d ",c[i][j]);
				else
					printf("%d",c[i][j]);
			}
			printf("\\n");			//每输出完矩形C的一列数据完后就换行一次
		}
	}
	else	//当数据完全匹配时输出此话
		printf("Error: %d != %d\\n",ca,rb);
	return 0;
}


44、 倒数第N个字符串 (15 分)

L1-050 倒数第N个字符串 (15 分)
给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 { aaa, aab, aac, …, aaz, aba, abb, …, abz, …, zzz }。这个序列的倒数第27个字符串就是 zyz。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。

输入格式:
输入在一行中给出两个正整数 L(2 ≤ L ≤ 6)和 N(≤10
​5
​​ )。

输出格式:
在一行中输出对应序列倒数第 N 个字符串。题目保证这个字符串是存在的。

输入样例:
3 7417
输出样例:
pat

#include<stdio.h>
#include<math.h>
#define L 6

int main()
{
	char ch[26]={'z','y','x','w','v','u','t','s','r','q','p','o','n','m'
	             ,'l','k','j','i','h','g','f','e','d','c','b','a'};
	char arr[L];
	int n,l,a,i;         //l为序列长度,n为序列所处倒序的位置,a为所求字符串的某个字符在ch数组中的位置 
	scanf("%d %d",&l,&n);
	n=n-1;               //根据推导过程发现,减去1后最后一个字符才是正确的
	for(i=0;i<l;i++)
	{
		a=n/pow(26,l-i-1);
		arr[i]=ch[a];
		n=n-a*pow(26,l-i-1);
	}
	for(i=0;i<l;i++)
	{
		printf("%c",arr[i]);
	}
	return 0;
 }

45、打折 (5 分)

L1-051 打折 (5 分)
去商场淘打折商品时,计算打折以后的价钱是件颇费脑子的事情。例如原价 ¥988,标明打 7 折,则折扣价应该是 ¥988 x 70% = ¥691.60。本题就请你写个程序替客户计算折扣价。

输入格式:
输入在一行中给出商品的原价(不超过1万元的正整数)和折扣(为[1, 9]区间内的整数),其间以空格分隔。

输出格式:
在一行中输出商品的折扣价,保留小数点后 2 位。

输入样例:
988 7
输出样例:
691.60

#include<stdio.h>
int main(void)
{
	double before_money;			//原价
	double after_money;			//打折后
	double zhe;					//折扣
	scanf("%lf %lf",&before_money,&zhe);
	after_money=before_money*zhe/10;
	printf("%.2lf\\n",after_money);
}

46、 2018我们要赢 (5 分)

L1-052 2018我们要赢 (5 分)
2018年天梯赛的注册邀请码是“2018wmyy”,意思就是“2018我们要赢”。本题就请你用汉语拼音输出这句话。

输入格式:
本题没有输入。

输出格式:
在第一行中输出:“2018”;第二行中输出:“wo3 men2 yao4 ying2 !”。

输入样例:

输出样例:
2018
wo3 men2 yao4 ying2 !

#include<stdio.h>
int main(void)
{
	printf("2018\\n");
	printf("wo3 men2 yao4 ying2 !\\n");
	return 0;
}

47、电子汪 (10 分)

L1-053 电子汪 (10 分)
据说汪星人的智商能达到人类 4 岁儿童的水平,更有些聪明汪会做加法计算。比如你在地上放两堆小球,分别有 1 只球和 2 只球,聪明汪就会用“汪!汪!汪!”表示 1 加 2 的结果是 3。

本题要求你为电子宠物汪做一个模拟程序,根据电子眼识别出的两堆小球的个数,计算出和,并且用汪星人的叫声给出答案。

输入格式:
输入在一行中给出两个 [1, 9] 区间内的正整数 A 和 B,用空格分隔。

输出格式:
在一行中输出 A + B 个Wang!。

输入样例:
2 1
输出样例:
Wang!Wang!Wan

#include<stdio.h>
int main(void)
{
	int A;	
	int B;
	scanf("%d %d",&A,&B);
	for(int i=1;i<=A+B;i++)
		printf("Wang!");
	return 0;
}

48、 谁是赢家 (10 分)

L1-055 谁是赢家 (10 分)
某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 3 名评委投票两部分共同决定。规则为:如果一位艺人的观众票数高,且得到至少 1 名评委的认可,该艺人就胜出;或艺人的观众票数低,但得到全部评委的认可,也可以胜出。节目保证投票的观众人数为奇数,所以不存在平票的情况。本题就请你用程序判断谁是赢家。

输入格式:
输入第一行给出 2 个不超过 1000 的正整数 Pa 和 Pb,分别是艺人 a 和艺人 b 得到的观众票数。题目保证这两个数字不相等。随后第二行给出 3 名评委的投票结果。数字 0 代表投票给 a,数字 1 代表投票给 b,其间以一个空格分隔。

输出格式:
按以下格式输出赢家:

The winner is x: P1 + P2
其中 x 是代表赢家的字母,P1 是赢家得到的观众票数,P2 是赢家得到的评委票数。

输入样例:
327 129
1 0 1
输出样例:
The winner is a: 327 + 1
鸣谢安阳师范学院软件学院李栋同学完善测试数据。

作者: 陈越
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB

#include<stdio.h>
int main(void)
{
	int Pa;			//a的得票数
	int Pb;			//b的得票数
	int num;		//评委投票
	int a=0,b=0;	//计算a、b评委投票总数
	scanf("%d %d",&Pa,&Pb);
	for(int i=0;i<3;i++)
	{
		scanf("%d",&num);
			if(num==0)
				a++;
			else
				b++;
	}
	if(Pa>Pb&&a!=0)
		printf("The winner is a: %d + %d\\n",Pa,a);
	else if(Pa<Pb&&b!=0)
		printf("The winner is b: %d + %d\\n",Pb,b);
	else if(Pa<Pb&&a==3)
		printf("The winner is a: %d + %d\\n",Pa,a);
	else if(Pa>Pb&&b==3)
		printf("The winner is b: %d + %d\\n",Pb,b);
}

49、链表去重 (25 分)

L2-002 链表去重 (25 分)
给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。

输入格式:
输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤10
​5
​​ ,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 −1 来表示。

随后 N 行,每行按以下格式描述一个结点:

地址 键值 下一个结点
其中地址是该结点的地址,键值是绝对值不超过10
​4
​​ 的整数,下一个结点是下个结点的地址。

输出格式:
首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。

输入样例:
00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854
输出样例:
00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 10*10*10*10*10+1
struct Node
{
    int jian,xia;		//jian→键位、xia→下一个结点
}node[N];
int main()
{
	int l,n;		//l→首个地址,n→有几个地址、输入几轮
    int first;		//每一轮的起始地址
	int i,j;		//用于循环和数组下标
	int tmp[10001]={0};
	//配合循环拆分链表时,检验这个下标是否出现过,若出现则赋值给被删除的链表
	int one[N],two[N];
	//  one → 表示去重后的链表,two → 表示被删除的链表
	int o=0,t=0;
	int num;		//num得到每一个地址的键值
	scanf("%d%d",&l,&n);
        for(i=0;i<n;i++)
        {
            scanf("%d",&first);
            scanf("%d%d",&node[first].jian,&node[first].xia);
        }
        for(i=l;node[i].xia != -1;)
        {
            int num=abs(node[i].jian);
            if(tmp[num]==0)
            {
                tmp[num]=1;
                one[o++]=i;		//存储地址
            }
            else
            {
                two[t++]=i;
            }
            i=node[i].xia;
        }
		num=abs(node[i].jian);//这里要注意一下最后一个下标
        if(tmp[num]==0)
        {	one[o++]=i;}
        else
        {   two[t++]=i;}
            printf("%05d %d ",one[0],node[one[0]].jian);
            for(j=1;j<o;j++)
            {
                printf("%05d\\n",one[j]);
                printf("%05d %d ",one[j],node[one[j]].jian);
            }
            printf("%d\\n",-1);
            if(t!=0)		//没删除过链表的情况需要判断一下
            {
                printf("%05d %d ",two[0],node[two[0]].jian);
                for(j=1;j<t;j++)
                {
                    printf("%05d\\n",two[j]);
                    printf("%05d %d ",two[j],node[two[j]].jian);
                }
                printf("%d\\n",-1);
            }
			return 0;
}



50、 名人堂与代金券 (25 分)

L2-027 名人堂与代金券 (25 分)
对于在中国

以上是关于PTA 程序设计天梯赛(41~60题)的主要内容,如果未能解决你的问题,请参考以下文章

题解PTA团体程序设计天梯赛L1-014 简单题 (5 分) Go语言|Golang

PTA 程序设计天梯赛(61~80题)

PTA 程序设计天梯赛(141~160题)

PTA 程序设计天梯赛(1~20题)

PTA 程序设计天梯赛(81~100题)

PTA 程序设计天梯赛(101~120题)