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

Posted 王睿丶

tags:

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

创作不易,有用请点个赞,感谢各位!

141、BCD解密 (10 分)

BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!

现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。

输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。

输出格式:
输出对应的十进制数。

输入样例:
18
输出样例:
12

#include<stdio.h>
int main()
{
	int n;
	int a[100000],k=0;
	int i,j;
	scanf("%d",&n);
	if(n==0)
	{
	  printf("0");
	  return 0;
	}
	while(n!=0)
	{
		a[k++]=n%16;
		n/=16;
	}
	for(i=k-1;i>=0;i--)
		printf("%d",a[i]);
}

142、掉入陷阱的数字 (15 分)

对任意一个自然数N
​0
​​ ,先将其各位数字相加求和,再将其和乘以3后加上1,变成一个新自然数N
​1
​​ ;然后对N
​1
​​ 重复这种操作,可以产生新自然数N
​2
​​ ;……多次重复这种操作,运算结果最终会得到一个固定不变的数N
​k
​​ ,就像掉入一个数字“陷阱”。

本题要求对输入的自然数,给出其掉入“陷阱”的过程。

输入格式:
在一行内给出一个自然数N
​0
​​ (N
​0
​​ <30000)。

输出格式:
对于输入的N
​0
​​ ,逐行输出其掉入陷阱的步骤。第i行描述N掉入陷阱的第i步,格式为: i:N
​i
​​ (i≥1)。当某一步得到的自然数结果N
​k
​​ (k≥1)与上一步N
​k−1
​​ 相同时,停止输出。

输入样例:
5
输出样例:
1:16
2:22
3:13
4:13

#include<stdio.h>
int number(int N);
int main (){
   int N=0,count=0,now=0,pre=0;
   scanf("%d",&N);
   now = number(N);
    while(1){
        count++;
        printf("%d:%d\\n",count,now);
        pre=now;
        now=number(now);
        if(pre==now){
          if(now!=N)//如果这个数的最终结果和N相等,则不用再输出
            printf("%d:%d\\n",count+1,now);
            break;
      }
  }
   return 0;
}
int number(int N){
    int add=0,num=N%10;
    if(num==N){
        add=N;
    }else{
        while(N!=0){
        add+=num;
        N/=10;
        num=N%10;
        }
    }
    return add*3+1;
}

143、简化的插入排序 (15 分)

本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。

输入格式:
输入在第一行先给出非负整数N(<10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。

输出格式:
在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。

输入样例:
5
1 2 4 5 7
3
输出样例:
1 2 3 4 5 7

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int comp(const void* a,const void* b)
{
	return *(int*)a - *(int*)b;
}
int main()
{
	int i;
	int a[12];
	int n;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	scanf("%d",&a[n]);
	qsort(a,n+1,sizeof(a[0]),comp);
	for(i=0;i<n+1;i++)
	printf("%d ",a[i]);
}

144、有理数比较 (10 分)

本题要求编写程序,比较两个有理数的大小。

输入格式:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

输出格式:
在一行中按照“a1/b1 关系符 a2/b2”的格式输出两个有理数的关系。其中“>”表示“大于”,“<”表示“小于”,“=”表示“等于”。

输入样例1:
1/2 3/4
输出样例1:
1/2 < 3/4
输入样例2:
6/8 3/4
输出样例2:
6/8 = 3/4

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int a1,b1,a2,b2;
	double sum1,sum2;
	scanf("%d/%d %d/%d",&a1,&b1,&a2,&b2);
	sum1 = a1*1.0/b1;
	sum2 = a2*1.0/b2;
	if(sum1>sum2)
	printf("%d/%d > %d/%d\\n",a1,b1,a2,b2);
	else if(sum1 == sum2)
	printf("%d/%d = %d/%d\\n",a1,b1,a2,b2);
	else
	printf("%d/%d < %d/%d\\n",a1,b1,a2,b2);
}

145、计算职工工资 (15 分)

给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。

输入格式:
输入在一行中给出正整数N。随后N行,每行给出一位职员的信息,格式为“姓名 基本工资 浮动工资 支出”,中间以空格分隔。其中“姓名”为长度小于10的不包含空白字符的非空字符串,其他输入、输出保证在单精度范围内。

输出格式:
按照输入顺序,每行输出一位职员的姓名和实发工资,间隔一个空格,工资保留2位小数。

输入样例:
3
zhao 240 400 75
qian 360 120 50
zhou 560 150 80
输出样例:
zhao 565.00
qian 430.00
zhou 630.00

#include<stdio.h>
#define N 1000
struct yuan
{
  char name[11];
  double z1;//如果这里用int型,则显示错误
  double z2;
  double z3;
  double sum
}ren[N];
int main()
{
  int n,i;
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    scanf("%s %lf %lf %lf",ren[i].name,&ren[i].z1,&ren[i].z2,&ren[i].z3);
    ren[i].sum=ren[i].z1+ren[i].z2-ren[i].z3;
  }
  for(i=0;i<n;i++)
  {
       printf("%s %.2lf\\n",ren[i].name,ren[i].sum);
  }
  return 0;
}

146、猴子选大王 (20 分)

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:
输入在一行中给一个正整数N(≤1000)。

输出格式:
在一行中输出当选猴王的编号。

输入样例:
11
输出样例:
7

#include<stdio.h>
int sum=0,i;
int funtion(int x,int y)	//x = 11, y = 3
{
	for(i=y-1;i<=x;i++)		//根据数学规律,应从i的初始值 = 报的特殊数-1 
	{						//每次一到3的倍数时,sum=0,然后重新进行计算
		sum = (sum+3)%i;	//sum+特殊数%i 
	}
	return sum;
}
int main()
{
	int i,n,sum=0;
	scanf("%d",&n);
	printf("%d",funtion(n,3)+1);
}

147、逆序的三位数 (10 分)

程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

输入格式:
每个测试是一个3位的正整数。

输出格式:
输出按位逆序的数。

输入样例:
123
输出样例:
321

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int n;
	int i,j;
	int a[3];
	int flag=-1;
	scanf("%d",&n);
	for(i=0;i<3;i++)
	{
		a[i]=n%10;
		n/=10;
	}
	for(i=0;i<3;i++)
	{
		if(a[i]!=0)
			flag=1;
		if(flag!=-1)
		{
			printf("%d",a[i]);
		}
		else if(a[i]!=0)
		{
			printf("%d",a[i]);
		}
	}
}

148、评分规则 (5 分)

小明与伙伴们游戏,请来了5个裁判。对于每个孩子的表现,每个裁判给一个分数。总评分的计算规则是:去掉最高分,去掉最低分,剩下的分数计算平均分,作为总评分。请你帮小明编写程序计算总评分。

输入格式:
在一行中给出5个在0到100之间的整数,用一个空格隔开。这个5个整数已经按照从大到小顺序排好了。

输出格式:
在一行中输出总评分,要求保留小数点后2位。

输入样例:
100 99 98 97 96
输出样例:
98.00

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int comp(const void*a ,const void*b)
{
	return *(int*)a - *(int*)b;
}
int main()
{
	int a[5];
	int i,j;
	for(i=0;i<5;i++)
	{
		scanf("%d",&a[i]);
	}
	qsort(a,5,sizeof(a[0]),comp);
	a[0]=0;
	a[4]=0;
	double avg = (a[1]+a[2]+a[3])/3;
	printf("%.2lf\\n",avg);
}

149、评委打分 (5 分)

班级里要搞智力竞赛啦!同学们都踊跃参加。进入最后决赛的是10个同学,随着一道道题目的出示,有时是1号选手得分,有时是5号选手得分,每次答对者得10分,最后结果如何呢?

输入格式:
第一行有十个整数,表示十位同学的初始分。第二行一个整数n,表示有n道题竞赛。 接下去有n行,每行有一个数字x,x表示本次可以加分的选手序号(每次答对者得10分)。

输出格式:
10个同学最终的得分值,每两位同学之间有一个空格。

输入样例:
10 0 0 0 10 10 0 0 0 10
3
1
10
1
输出样例:
30 0 0 0 10 10 0 0 0 20

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int i,j;
	int a[10];
	for(i=0;i<10;i++)
	scanf("%d",&a[i]);
	int n;
	int b;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&b);
		a[b-1]+=10;
	}
	for(i=0;i<10;i++)
	{
		if(i==10-1)
		printf("%d",a[i]);
		else
		printf("%d ",a[i]);
	}
}

150、特殊a串数列求和 (20 分)

给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。

输入格式:
输入在一行中给出不超过9的正整数a和n。

输出格式:
在一行中按照“s = 对应的和”的格式输出。

输入样例:
2 3
输出样例:
s = 246

#include<stdio.h>
#include<math.h>
int main()
{
	int a,n;
	scanf("%d%d",&a,&n);
	int i,j;
	int t=a;
	int sum=a;
	for(i=1;i<n;i++)
	{
			t = a*(pow(10,i))+t;
			//printf("%d\\n",t);
			sum+=t;
	}
	printf("s = %d\\n",sum);
}

151、换硬币 (20 分)

将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。

输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

输入样例:
13
输出样例:
fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4

#include<stdio.h>
#include<math.h>
int main()
{
	int i,j,k;
	int n;
	int t=0;
	scanf("%d",&n);
	for(i=n/5;i>=1;i--)
	{
		for(j=n/2;j>=1;j--)
		{
			for(k=n;k>=1;k--)
			{
				if(i*5+j*2+k==n)
				{
					t++;
					printf("fen5:%d, fen2:%d, fen1:%d, total:%d\\n",i,j,k,i+j+k);
				}
			}
		}
	}
	printf("count = %d\\n",t);
}

152、高空坠球 (20 分)

皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?

输入格式:
输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。

输出格式:
在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。

输入样例:
33 5
输出样例:
94.9 1.0

#include<stdio.h>
int main()
{
	double m;	//初始高度
	int n;	//第n次反弹的高度
	scanf("%lf%d",&m,&n);
	double sum=m;
	if(m==0 || n==0)
	{
	  printf("0.0 0.0\\n");
	  return 0;
	}
	for(int i=2;i<=n;i++)
	{
		sum+=m;
		m/=2;
	//	printf("m = %lf sum = %lf\\n",m,sum);
	}
	m/=2;
	printf("%.1lf %.1lf\\n",sum,m);
}

153、输出学生成绩 (20 分)

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

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

输出格式:
按照以下格式输出:

average = 平均成绩
max = 最高成绩
min = 最低成绩
结果均保留两位小数。

输入样例:
3
85 90 95
输出样例:
average = 90.00
max = 95.00
min = 85.00

#include <stdio.h>
#include <stdlib.h>
 
int main()
{	
    int n,i;
    int *p; 
    float sMax,sMin,sSum =0;
    float sAvg;

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

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

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

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

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

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

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