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

Posted 王睿丶

tags:

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

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

101、整数的分类处理 (20 分)

给定 N 个正整数,要求你从中得到下列三种计算结果:

A1 = 能被 3 整除的最大整数
A2 = 存在整数 K 使之可以表示为 3K+1 的整数的个数
A3 = 存在整数 K 使之可以表示为 3K+2 的所有整数的平均值(精确到小数点后 1 位)
输入格式:
输入首先在第一行给出一个正整数 N,随后一行给出 N 个正整数。所有数字都不超过 100,同行数字以空格分隔。

输出格式:
在一行中顺序输出 A1、A2、A3的值,其间以 1 个空格分隔。如果某个数字不存在,则对应输出NONE。

输入样例 1:
8
5 8 7 6 9 1 3 10
输出样例 1:
9 3 6.5
输入样例 2:
8
15 18 7 6 9 1 3 10
输出样例 2:
18 3 NONE

7-7 整数的分类处理 (20 分)

#include<stdio.h>
int main()
{
	int n,a2=0,a3=0,i,x,max=0,sum=0;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&x);
		if(x%3==0&&x>max)	//得到A1数
			max=x;	
		if((x-1)%3==0)		//成立的个数==A2
			a2++;
		if((x-2)%3==0)		//成立的整数和/成立的个数==A3
		{	a3++;	sum+=x;	}
	}
	if(max==0)	printf("NONE ");	//按照题目说的a1,a2,a3中某个值不在就输出HONE
	else		printf("%d ",max);
	if(a2==0)	printf("HONE ");
	else		printf("%d ",a2);
	if(sum==0)	printf("HONE");
	else		printf("%.1f",sum*1.0/a3);
	return 0;
}

102、统计工龄 (20 分)

给定公司N名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。

输入格式:
输入首先给出正整数N(≤10
​5
​​ ),即员工总人数;随后给出N个整数,即每个员工的工龄,范围在[0, 50]。

输出格式:
按工龄的递增顺序输出每个工龄的员工个数,格式为:“工龄:人数”。每项占一行。如果人数为0则不输出该项。

输入样例:
8
10 2 0 5 7 2 5 2
输出样例:
0:1
2:3
5:2
7:1
10:1
7-8 统计工龄 (20 分)

#include<stdio.h>
int main()
{
	int i,n,a,b[52]={0};
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a);
			b[a]++;
	}
	for(i=0;i<52;i++)
		if(b[i]!=0)
			printf("%d:%d\\n",i,b[i]);

	return 0;
}

103、7-10 数组循环左移 (20 分)

本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a
​0
​​ a
​1
​​ ⋯a
​n−1
​​ )变换为(a
​m
​​ ⋯a
​n−1
​​ a
​0
​​ a
​1
​​ ⋯a
​m−1
​​ )(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:
输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。

输出格式:
在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

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

7-10 数组循环左移 (20 分)

#include<stdio.h>
int main(void){
	
	int a[101];
	int n,m,i;
	while(scanf("%d%d",&n,&m)!=EOF){
		
		for( i=0;i < n;i++)
		  scanf("%d",&a[i]);
		
		for( i =m;i<n+m;i++){
			
			if( i >=n)
			  printf("%d",a[ i%n]);
			else printf("%d",a[i]);
			
			if( i == n+m -1)
			  printf("\\n");
			else printf(" ");    
	 	}
	 }
 return 0;
}

104、求链式线性表的倒数第K项 (20 分)

给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。

输入格式:
输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。

输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。

输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
输出样例:
7

7-11 求链式线性表的倒数第K项 (20 分)

#include<stdio.h>
#include<string.h>
#define maxn 0x7fffffff
int a[maxn];
int main()
{
    int k;
    scanf("%d",&k);
    int count=0,x;
    while(1)
    {
        scanf("%d",&x);
        if(x<0)break;
        else 
        {
            a[count]=x;
            count++; 
        } 
    }
    if(count-k<0)
     printf("NULL\\n");
    else
     printf("%d\\n",a[count-k]); 
    return 0;
}

105、方阵循环右移 (20 分)

本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。

输入格式:
输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。

输出格式:
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。

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

7-12 方阵循环右移 (20 分)

#include <stdio.h>
//时间:2018年4月23日20:08:02
//思路:通过思考发现,循环输出主要是数组下标的控制问题,只要能够控制列的下标就可实现
//      循环的打印出循环右移后的二维数组,正是因为循环右移,所以需要将数值m控制在0至n-1中。
int main()
{
	int a[10][10];
	int i, j, n, m;
	scanf("%d%d",&m,&n);
	for (i = 0; i<n; i++)
	{
		for (j = 0; j<n; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	m %= n; //使得m的取值为小于n的值,钳制在0至n-1中,便于下面下标的控制。
	for (i = 0; i<n; i++)
	{
		for (j = 0; j<n; j++)
		{
			printf("%d ", a[i][(n - m + j) % n]); //循环输出下标的控制 a[i][(n-m+j) % n]
		}
		printf("\\n");
	}
	return 0;
}

106、组个最小数 (20 分)

给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。

现给定数字,请编写程序输出能够组成的最小的数。

输入格式:
输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。

输出格式:
在一行中输出能够组成的最小的数。

输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558

7-3 组个最小数 (20 分)

#include<stdio.h>
int main(int argc, char const *argv[])
{
	int i,j;
	int x[9];
	for(i=0;i<10;i++)
		scanf("%d",&x[i]);
	for(i=1;i<10;i++)
		if(x[i])
		{	printf("%d",i);  x[i]--;  break;	}
	for(i=0;i<10;i++)
		while(x[i])
		{	printf("%d",i);	x[i]--;		}
	return 0;
}

107、猴子吃桃问题 (15 分)

一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?

输入格式:
输入在一行中给出正整数N(1<N≤10)。

输出格式:
在一行中输出第一天共摘了多少个桃子。

输入样例:
3
输出样例:
10

7-1 猴子吃桃问题 (15 分)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int i,j;
	int n;
	int sum=2;
	scanf("%d",&n);
	for(i=1;i<n;i++)
	{
		if(i==n-1)
			sum*=2;
		else
			sum=sum*2+1;
	}
	printf("%d\\n",sum);
	return 0;
}

108、字符串字母大小写转换 (15 分)

本题要求编写程序,对一个以“#”结束的字符串,将其小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其他字符不变输出。

输入格式:
输入为一个以“#”结束的字符串(不超过30个字符)。

输出格式:
在一行中输出大小写转换后的结果字符串。

输入样例:
Hello World! 123#
输出样例:
hELLO wORLD! 123

7-2 字符串字母大小写转换 (15 分)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int i,j;
	char a[10010];
	gets(a);
	int k = strlen(a);
	a[k-1] = '\\0';
	for(i=0;a[i]!='\\0';i++)
	{
		if(((a[i]>='a'&&a[i]<='z') || (a[i]>='A'&&a[i]<='Z')) ==0)
			continue;
		else if(a[i]>='a'&&a[i]<='z')
			a[i]-=32;
		else
			a[i]+=32;
	}
	puts(a);
	return 0;
}

109、计算分段函数[3] (10 分)

本题目要求计算下列分段函数f(x)的值:

输入格式:
输入在一行中给出实数x。

输出格式:
在一行中按“f(x) = result”的格式输出,其中x与result都保留一位小数。

输入样例1:
10
输出样例1:
f(10.0) = 0.1
输入样例2:
234
输出样例2:
f(234.0) = 234.0

7-5 计算分段函数[3] (10 分)

#include<string.h>
#include<stdlib.h>
int main()
{
	float x;
	float result=0;
	scanf("%f",&x);
	if(x!=10)
		result = x;
	else
		result = 1/x;
	printf("f(%.1f) = %.1f\\n",x,result);
	return 0;
}

110、查找整数 (10 分)

本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。

输入格式:
输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。

输出格式:
在一行中输出X的位置,或者“Not Found”。

输入样例1:
5 7
3 5 7 1 9
输出样例1:
2
输入样例2:
5 7
3 5 8 1 9
输出样例2:
Not Found

7-6 查找整数 (10 分)

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int n,x,i;
	int c[10010];
	scanf("%d%d",&n,&x);
	for(i=0;i<n;i++)
	{
		scanf("%d",&c[i]);
		if(c[i]==x)
			break;
	}
	if(i==n)
	printf("Not Found\\n");
	else
	printf("%d\\n",i);
	return 0;
}

111、旅游规划 (25 分)

有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

输入格式:
输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

输出格式:
在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

输入样例:
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
输出样例:
3 40

7-7 旅游规划 (25 分)

这是一次比赛出现的提醒,正确答案我就不放了,这是我当时写的17分代码,让你们看看大概思路,如果这道题想要的满分,要对迪…啥的那个算法才可以!

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int cheng1[5010];	//城市1
	int cheng2[5010];	//城市2
	int chang[5010];		//高速公路长度
	int money[5010];		//收费总额
	int i,j;
	int N;	//城市编号
	int M;	//高速公路条数
	int S;	//出发地的城市编号
	int D;	//目的地的城市编号
	int MIN=0;	//最短路径
	int result=0;	//收费额
	int shangMIN=0;
	int shangResult=0;
	int index;
	scanf("%d%d%d%d",&N,&M,&S,&D);
	for(i=0;i<M;i++)
		//输入每一条高速公路的信息
		scanf("%d%d%d%d",&cheng1[i],&cheng2[i],&chang[i],&money[i]);
	for(i=0;i<M;)
	{
		if((cheng1[i]==0)&&(cheng2[i]==N-1))
		{	result=money[i];	MIN=chang[i];index=1;}
		else
		{
			MIN=chang[i]+chang[i+1];
			result=money[i]+money[i+1];
			index=2;
		}
		if(i==0)
		{
			shangMIN = MIN;
			shangResult=result;
		}
		else
		{
			if(MIN==shangMIN && result<shangResult)
			{
				shangMIN=MIN;
				shangResult=result;
			}
		}
		if(index==1)
			i++;
		else if(index==2)
			i=i+2;
	}
	printf("%d %d\\n",shangMIN,shangResult);
	return 0;
}

112、黑洞数 (20 分)

黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。

任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所

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

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

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

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

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

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

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