PTA 程序设计天梯赛(161~180题)

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

161、单词长度 (15 分)

你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it’s算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。

输入格式:
输入在一行中给出一行文本,以.结束

提示:用scanf(“%c”,…);来读入一个字符,直到读到.为止。

输出格式:
在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。

输入样例:
It’s great to see you here.
输出样例:
4 5 2 3 3 4

#include<stdio.h>
int main()
{
  /* 这道题有四大最坑的点
     1. 第一个是只有一个单词的时候,开头不能有多余的空格,结尾有一个空格时,也一样
     2. 第二个就是当次数为0时不显示
     3. 第三是一定要注意空格不能有多余无论首、尾、还是中
     */
	char c;
	int flag=1;   //控制空格打印不能多余
	int k=0;
	scanf("%c",&c);
	while(c!='.')   //如果只有一个点,那不需要显示了
	{
		if(c ==' ')
		{
			if(k!=0)
			{
				if(flag)
				{
					printf("%d",k);
					flag=0; //第一个单词打印完后,后面就可以以 %d的形式来让末尾没有空格打印
				}
				else      
				{
					printf(" %d",k);
				}
				k=0;
			}
		}
		else
		{	k++;	}
		scanf("%c",&c);
	}
	if(k!=0)        //如果最后一个单词是空格不用打印
	{
		if(flag)      //负责防止首尾有多余空格
		{
			printf("%d",k);
		}
		else
		{
			printf(" %d",k);
		}
	}
}

162、表格输出 (5 分)

本题要求编写程序,按照规定格式输出表格。

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

输出格式:
要求严格按照给出的格式输出下列表格:

Province Area(km2) Pop.(10K)

Anhui 139600.00 6461.00
Beijing 16410.54 1180.70
Chongqing 82400.00 3144.23
Shanghai 6340.50 1360.26
Zhejiang 101800.00 4894.00

#include<stdio.h>
int main()
{
printf("------------------------------------\n");
printf("Province      Area(km2)   Pop.(10K)\n");
printf("------------------------------------\n");
printf("Anhui         139600.00   6461.00\n");
printf("Beijing        16410.54   1180.70\n");
printf("Chongqing      82400.00   3144.23\n");
printf("Shanghai        6340.50   1360.26\n");
printf("Zhejiang      101800.00   4894.00\n");
printf("------------------------------------\n");
}

163、装箱问题 (20 分)

在这里插入图片描述

输入格式:
输入第一行给出物品个数N(≤1000);第二行给出N个正整数s
​i
​​ (1≤s
​i
​​ ≤100,表示第i项物品的大小)。

输出格式:
按照输入顺序输出每个物品的大小及其所在的箱子序号,每个物品占1行,最后一行输出所需的箱子数目。

输入样例:
8
60 70 80 90 30 40 10 20
输出样例:
60 1
70 2
80 3
90 4
30 1
40 5
10 1
20 2
5

#include<stdio.h>
#include<string.h>
struct Love{
	int xiang;
	int ji;
}love[1001];
int main()
{
	int b[1000]={100};
	int max=0;
	int i,j;
	int first;
	int n;
	int num=0;
	int k=0;
	int a[100],one=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&love[i].xiang);
	}
	for(i=0;i<n;i++)
		b[i]=100;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(love[i].xiang<=b[j])
			{
				love[i].ji = j;	
				b[j]-=love[i].xiang;
				if(max<j)
					max=j;
				break;
			}
		}
		
	}
	
	
	for(i=0;i<n;i++)
	{
		printf("%d %d\n",love[i].xiang,love[i].ji+1);
	}
	printf("%d\n",max+1);
}

164、求交错序列前N项和 (15 分)

本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+… 的前N项之和。

输入格式:
输入在一行中给出一个正整数N。

输出格式:
在一行中输出部分和的值,结果保留三位小数。

输入样例:
5
输出样例:
0.917
作者: 陈建海
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB

#include<stdio.h>
int main()
{
	int n;
	int i;
	int zi = 1,mu = 1;
	int flag=1;
	double sum=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		sum+=zi*1.0/mu*flag;
		flag=-flag;
		zi+=1;
		mu+=2;
	}
	printf("%.3lf\n",sum);
}

165、求集合数据的均方差 (15 分)

在这里插入图片描述
输入格式:
输入首先在第一行给出一个正整数 N(≤10
​4
​​ ),随后一行给出 N 个正整数。所有数字都不超过 1000,同行数字以空格分隔。

输出格式:
输出这N个数的均方差,要求固定精度输出小数点后5位。

输入样例 1:
10
6 3 7 1 4 8 2 9 11 5
输出样例 1:
3.03974
输入样例 2:
1
2
输出样例 2:
0.00000

#include<stdio.h>
#include<math.h>
int main()
{
	int n;
	int i,j;
	double x=0;
	int a[10005];
	double result;
	int sum=0;
	double avg; 
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{ 
		scanf("%d",&a[i]);
		sum+=a[i];
		//printf("1");
	}
	avg = sum*1.0/n;
	for(i=0;i<n;i++)
	{
		x += (a[i]-avg)*(a[i]-avg);
		//printf("2");
	}
	result = sqrt(x/n);
	printf("%.5lf\n",result);	
}

166、币值转换 (20 分)

输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。

输入格式:
输入在一行中给出一个不超过9位的非负整数。

输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。

输入样例1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
输入样例2:
6900
输出样例2:
gQjB

这道题我没写对,没拿到满分,好像15分吧,我想纪念一下自己的代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int num;
	int i,j,n,xing=0;
	char s[100];
	char str1[100],a=-1;
	int k=0;		//计算位数
	int flag=1;
	gets(s);
	int len = strlen(s);
	for(i=0;i<len;i++)
	{
		num = s[i]-'0';
		if(num!=0)
		{
			xing++;
			flag=0;
		}
		if(i==len-1 && num!=0)
			flag=1;
	}
	for(i=0;s[i]!='\0';i++)
	{
		num = s[i]-'0';
		if(s[i]+=2)
		switch(num)
		{
		case 0:str1[++a]='a';break;
		case 1:str1[++a]='b';break;
		case 2:str1[++a]='c';break;
		case 3:str1[++a]='d';break;
		case 4:str1[++a]='e';break;
		case 5:str1[++a]='f';break;
		case 6:str1[++a]='g';break;
		case 7:str1[++a]='h';break;
		case 8:str1[++a]='i';break;
		case 9:str1[++a]='j';break;
		}
		a++;
		k++;
	}
	/*for(i=0;i<k;i++)
		printf("%c",str1[i]);*/		//调试
	n=0;
	for(i=k*2-1;i>=0;)
	{
		if(n==1 || n==5)
		{
			str1[i]='S';
		}
		else if(n==2 || n==6)
		{
			str1[i]='B';
		}
		else if(n==3 || n==7)
		{
			str1[i]='Q';
		}
		else if(n==4)
		{
			str1[i]='W';
		}
		else
		{
			str1[i]='Y';
		}
		
		n++;
		i-=2;
	}
	if(flag)
		for(i=0;i<k+k-1;i++)
			printf("%c",str1[i]);
	else
			for(i=0;i<k+k-1-xing*2+1;i++)
		printf("%c",str1[i]);
}

167、求矩阵的局部极大值 (15 分)

给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

输入格式:
输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

输出格式:
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

输入样例1:
4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1
输出样例1:
9 2 3
5 3 2
5 3 4
输入样例2:
3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1
输出样例2:
None 3 5

#include<stdio.h>
struct Love{
	int hang;
	int lie;
	int max;
}Max[200];
int main()
{
	int m,n;
	int i,j;
	int a[300][300];
	//int max[20],k=0;
	int k=0;
	int flag=0;
	scanf("%d%d",&m,&n);
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	for(i=0;i<m;i++)
	{
		if(i==0)
			continue;
		if(i==m-1)
			break;
		for(j=0;j<n;j++)
		{
			if(j==0||j==n-1)
				continue;
			if(a[i][j]>a[i-1][j] && a[i][j]>a[i+1][j] && a[i][j]>a[i][j+1] && a[i][j]>a[i][j-1])
			{
									Max[k].max=a[i][j];
									Max[k].hang=i+1;
									Max[k].lie=j+1;
									k++;
									flag=1;
			}
		}
	}
	if(flag!=0)
	{
		for(i=0;i<k;i++)
		{
			printf("%d %d %d\n",Max[i].max,Max[i].hang,Max[i].lie);
		}
	}
	else
	{
		printf("None %d %d\n",m,n);
	}
}

168、查询水果价格 (15 分)

给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。

首先在屏幕上显示以下菜单:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
用户可以输入编号1~4查询对应水果的单价。当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0。

输入格式:
输入在一行中给出用户连续输入的若干个编号。

输出格式:
首先在屏幕上显示菜单。然后对应用户的每个输入,在一行中按格式“price = 价格”输出查询结果,其中价格保留两位小数。当用户连续查询次数超过5次、或主动输入0时,程序结束。

输入样例1:
3 -1 0 2
输出样例1:
[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
price = 4.10
price = 0.00
输入样例2:
1 2 3 3 4 4 5 6 7 8
输出样例2:
[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
price = 3.00
price = 2.50
price = 4.10
price = 4.10
price = 10.20

#include<stdio.h>
int main()
{
	int i,j;
	int n;
	int x;
	printf("[1] apple\n");
	printf("[2] pear\n");
	printf("[3] orange\n");
	printf("[4] grape\n");
	printf("[0] exit\n");
	
	for(i=0;i<5;i++)
	{
		scanf("%d",&x);
		if(x==0)
		break;
		if(x<0 || x>4)
		printf("price = 0.00\n");
		if(x==1)
		printf("price = 3.00\n");
		else if(x==2)
		printf("price = 2.50\n");
		else if(x==3)
		printf("price = 4.10\n");
		else if(x==4)
		printf("price = 10.20\n");
		
	}
}

169、混合类型数据格式化输入 (5 分)

本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。

输入格式:
输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。

输出格式:
在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。

输入样例:
2.12 88 c 4.7
输出样例:
c 88 2.12 4.70

#include<stdio.h>
int main()
{
	double a;
	int b;
	char c;
	double d;
	scanf("%lf%d %c%lf",&a,&b,&c,&d);
	printf("%c %d %.2lf %.2lf\n",c,b,a,d);
}

170、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]);
}

171、串的模式匹配 (25 分)

给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。

本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:

数据0:小规模字符串,测试基本正确性;
数据1:随机数据,String 长度为 10
​5
​​ ,Pattern 长度为 10;
数据2:随机数据,String 长度为 10
​5
​​ ,Pattern 长度为 10
​2
​​ ;
数据3:随机数据,String 长度为 10
​5
​​ ,Pattern 长度为 10
​3
​​ ;
数据4:随机数据,String 长度为 10
​5
​​ ,Pattern 长度为 10
​4
​​ ;
数据5:String 长度为 10
​6
​​ ,Pattern 长度为 10
​5
​​ ;测试尾字符不匹配的情形;
数据6:String 长度为 10
​6
​​ ,Pattern 长度为 10
​5
​​ ;测试首字符不匹配的情形。
输入格式:
输入第一行给出 String,为由英文字母组成的、长度不超过 10
​6
​​ 的字符串。第二行给出一个正整数 N(≤10),为待匹配的模式串的个数。随后 N 行,每行给出一个 Pattern,为由英文字母组成的、长度不超过 10
​5
​​ 的字符串。每个字符串都非空,以回车结束。

输出格式:
对每个 Pattern,按照题面要求输出匹配结果。

输入样例:
abcabcabcabcacabxy
3
abcabcacab
cabcabcd
abcabcabcabcacabxyz
输出样例:
abcabcacabxy
Not Found
Not Found

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	char str1[1000001],str2[1000001];
	int i,n;
	gets(str1);
	scanf("%d",&n);
	getchar();
	for(i=0;i<n;i++)
	{
		gets(str2);
		char *p=strstr(str1,str2);
		if(p!=NULL)
		{
			for(;*p!='\0';p++)
				printf("%c",*p);
			printf("\n");
		}
		else
			printf("Not Found\n");
	}
	return 0;
}

172、Say Hello to Integers (5 分)

Say hello to integers? Yes! 你没看错! 现在我们来向整数说“你好~” 本题读入两个整数,然后输出对她们的问候语。

输入格式:
在一行中给出两个绝对值不超过32767的整数A和B,两数之间有一个空格

输出格式:
在一行中输出 “Hello, A and B!” (其中A和B用实际输入的整数代替)

输入样例:
1949 2015
输出样例:
Hello, 1949 and 2015!

#include<stdio.h>
int main(void)
{
	int n,m;
	scanf("%d%d",&n,&m);
	printf("Hello, %d and %d!\n",n,m);
}

173、PTA使我精神焕发 (5 分)

PTA使我精神焕发.jpg

以上是湖北经济学院同学的大作。本题就请你用汉语拼音输出这句话。

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

输出格式:
在一行中按照样例输出,以惊叹号结尾。

输入样例:

输出样例:
PTA shi3 wo3 jing1 shen2 huan4 fa1 !

#include<stdio.h>
int main()
{
  printf("PTA shi3 wo3 jing1 shen2 huan4 fa1 !\n");
  return 0;
}

174、温度转换 (5 分)

本题要求编写程序,计算华氏温度150°F对应的摄氏温度。计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型。

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

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

fahr = 150, celsius = 计算所得摄氏温度的整数值

#include<stdio.h>
int main()
{
  int f=150;
  printf("fahr = 150, celsius = %d\n",5*(f-32)/9);
  return 0;
}

175、输出菱形图案 (5 分)

本题要求编写程序,输出指定的由“A”组成的菱形图案。

输入格式:
本题无输入

输出格式:
按照下列格式输出由“A”组成的菱形图案。

A
A A
A

#include<stdio.h>
int main()
{
	printf("  A\n");
	printf("A   A\n");
	printf("  A\n");
}

176、吃鱼还是吃肉 (10 分)

在这里插入图片描述
在这里插入图片描述
国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。

现在你要根据小宝宝的身高体重,给出补充营养的建议。

输入格式:
输入在第一行给出一个不超过 10 的正整数 N,随后 N 行,每行给出一位宝宝的身体数据:

性别 身高 体重
其中性别是 1 表示男生,0 表示女生。身高和体重都是不超过 200 的正整数。

输出格式:
对于每一位宝宝,在一行中给出你的建议:

如果太矮了,输出:duo chi yu!(多吃鱼);
如果太瘦了,输出:duo chi rou!(多吃肉);
如果正标准,输出:wan mei!(完美);
如果太高了,输出:ni li hai!(你厉害);
如果太胖了,输出:shao chi rou!(少吃肉)。
先评价身高,再评价体重。两句话之间要有 1 个空格。

输入样例:
4
0 130 23
1 129 27
1 130 30
0 128 27
输出样例:
ni li hai! duo chi rou!
duo chi yu! wan mei!
wan mei! shao chi rou!
duo chi yu! shao chi rou!

#include<stdio.h> 
int main()
{
	int a,s,h,w;
	scanf("%d",&a);
	while(a--)
	{
		scanf("%d %d %d",&s,&h,&w);
	    switch(s)
	    {
			case 1: 
			if(h==130) printf("wan mei! ");
			else if(h<130) printf("duo chi yu! ");
			else if(h>130) printf("ni li hai! ");
			if(w==27) printf("wan mei!\n");
			else if(w<27) printf("duo chi rou!\n");
			else if(w>27) printf("shao chi rou!\n");
			break;
			case 0:
			if(h==129) printf("wan mei! ");
			else if(h<129) printf("duo chi yu! ");
			else if(h>129) printf("ni li hai! ");
			if(w==25) printf("wan mei!\n");
			else if(w<25) printf("duo chi rou!\n");
			else if(w>25) printf("shao chi rou!\n");
			break;
		}
	}
	return 0;
}

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

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王睿丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值