PTA 程序设计天梯赛(141~160题)
Posted 王睿丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PTA 程序设计天梯赛(141~160题)相关的知识,希望对你有一定的参考价值。
文章目录
- 141、BCD解密 (10 分)
- 142、掉入陷阱的数字 (15 分)
- 143、简化的插入排序 (15 分)
- 144、有理数比较 (10 分)
- 145、计算职工工资 (15 分)
- 146、猴子选大王 (20 分)
- 147、逆序的三位数 (10 分)
- 148、评分规则 (5 分)
- 149、评委打分 (5 分)
- 150、特殊a串数列求和 (20 分)
- 151、换硬币 (20 分)
- 152、高空坠球 (20 分)
- 153、输出学生成绩 (20 分)
- 154、求整数的位数及各位数字之和 (15 分)
- 155、 约分最简分式 (15 分)
- 156、我是升旗手 (10 分)
- 157、人民币兑换 (15 分)
- 158、两个有序序列的中位数 (25 分)
- 159、找出总分最高的学生 (15 分)
- 160、求给定精度的简单交错序列部分和 (15 分)
创作不易,有用请点个赞,感谢各位!
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题)的主要内容,如果未能解决你的问题,请参考以下文章