PTA 程序设计天梯赛(101~120题)
Posted 王睿丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PTA 程序设计天梯赛(101~120题)相关的知识,希望对你有一定的参考价值。
文章目录
- 101、整数的分类处理 (20 分)
- 102、统计工龄 (20 分)
- 103、7-10 数组循环左移 (20 分)
- 104、求链式线性表的倒数第K项 (20 分)
- 105、方阵循环右移 (20 分)
- 106、组个最小数 (20 分)
- 107、猴子吃桃问题 (15 分)
- 108、字符串字母大小写转换 (15 分)
- 109、计算分段函数[3] (10 分)
- 110、查找整数 (10 分)
- 111、旅游规划 (25 分)
- 112、黑洞数 (20 分)
- 113、龟兔赛跑 (20 分)
- 114、螺旋方阵 (20 分)
- 115、删除字符串中的子串 (20 分)
- 116、 A-B (20 分)
- 117、猜数字 (20 分)
- 118、40059 四则运算 (15 分)
- 119、宿舍谁最高? (20 分)
- 120、阶梯电价 (15 分)
创作不易,有用请点个赞,感谢各位!
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
#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
#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
#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
#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
#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
#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
#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
#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
#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
这是一次比赛出现的提醒,正确答案我就不放了,这是我当时写的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题)的主要内容,如果未能解决你的问题,请参考以下文章