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。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)

例如,对三位数207:

第1次重排求差得:720 - 27 = 693;
第2次重排求差得:963 - 369 = 594;
第3次重排求差得:954 - 459 = 495;
以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。

任意输入一个三位数,编程给出重排求差的过程。

输入格式:
输入在一行中给出一个三位数。

输出格式:
按照以下格式输出重排求差的过程:

序号: 数字重排后的最大数 - 重排后的最小数 = 差值
序号从1开始,直到495出现在等号右边为止。

输入样例:
123
输出样例:
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495

7-8 黑洞数 (20 分)

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
int number[6] = {0};
int MAX,MIN;
int sum=0;
int swap2(int x,int y)
{
	if(x<y)
		return x;
	else
		return y;
}
int swap(int x,int y)
{
	if(x>y)
		return x;
	else
		return y;
}
int main()
{
	int n;
	int ci=1;
	int i=0,j;
	int index;
	int ge,shi,bai;
	int result;
	scanf("%d",&n);
	index = n;
	while(1)
	{
		ge=index%10;
		shi=index/10%10;
		bai=index/100;
			number[0] = ge + shi*100 + bai*10;
			number[1] = shi + ge*10 + bai*100;
			number[2] = shi + ge*100 + bai*10;
			number[3] = bai + shi*10 + ge*100;
			number[4] = bai + shi*100 + ge*10;
			number[5] = index;
			MAX=number[0];
			MIN=number[0];
		for(i=1;i<6;i++)
			MAX = swap(number[i],MAX);
		for(i=1;i<6;i++)
			MIN = swap2(number[i],MIN);
		sum = MAX-MIN;
		printf("%d: %d - %d = %d\n",ci,MAX,MIN,sum);

		ci++;
		index = sum;
		if(sum==495)
			break;
	}
	return 0;
}

113、龟兔赛跑 (20 分)

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:
输入在一行中给出比赛时间T(分钟)。

输出格式:
在一行中输出比赛的结果:乌龟赢输出@@,兔子赢输出_,平局则输出--;后跟1空格,再输出胜利者跑完的距离。

输入样例:
242
输出样例:
@_@ 726

7-9 龟兔赛跑 (20 分)

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int fen;
	int i,j;
	int gui=0,tu=0;
	int index=0;	//标记兔子休息时间
	int swap=1;		//决定兔子是否还继续跑
	scanf("%d",&fen);
	for(i=1;i<=fen;i++)
	{
		if(index==30)
		{	index=0;	swap=1;	}
		if(swap!=-1)
		{
			gui+=3;
			tu+=9;
		}
		else
		{
			gui+=3;
			index++;
		}
		if(i%10==0)
		{
			if(tu>gui)
				swap=-1;
		}		
	}
	if(gui>tu)
	printf("@_@ %d\n",gui);
	else if(gui==tu)
	printf("-_- %d\n",gui);
	else
	printf("^_^ %d\n",tu);
	//printf("gui = %d,tu = %d\n",gui,tu);
	return 0;
}

114、螺旋方阵 (20 分)

所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。

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

输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。

输入样例:
5
输出样例:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

7-4 螺旋方阵 (20 分)

#include<stdio.h>
int main()
{
	int n;
	int h=0,l=0;
	int result=1;
	int t;
	int a[100][100]={0};
	scanf("%d",&n);
	a[h][l]=1;
	while(n*n!=result)
	{
		for(t=result;;)		//横
	{
		if((l+1<n && !a[h][l+1])!=true)
			break;
		a[h][++l] = ++result;
	}
	for(t=result;;)		//竖
	{
		if((h+1<n && !a[h+1][l])!=true)
			break;
		a[++h][l] = ++result;
	}	
	for(t=result;;)		//横
	{
		if((l-1>=0 && !a[h][l-1])!=true)
			break;
		a[h][--l] = ++result;
	}
	for(t=result;;)		//竖
	{
		if((h-1>=0 && !a[h-1][l])!=true)
			break;
		a[--h][l] = ++result;
	}
	}
		
	for(h=0;h<n;h++)
	{
		for(l=0;l<n;l++)
			printf("%3d",a[h][l]);
		printf("\n");
	}
	return 0;
}

115、删除字符串中的子串 (20 分)

输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。

输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。

输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。

输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male

7-5 删除字符串中的子串 (20 分)

#include<stdio.h>
#include<string.h>
char a[85],b[85],l,m;
void dete1(char *p,char *q){
   p=strstr(p,q);
   while(*(p+l)!='\0'){
   	*p=*(p+l);
   	*p++;
   }
   *p=*(p+l);
   return ;
}
int main(){
	int i,j,k;
    gets(a);
    gets(b);
	l=strlen(b);
	while(strstr(a,b)!=NULL){
		 m=strlen(a);
         dete1(a,b); 
	   }
     printf("%s\n",a);
	return 0;
} 

116、 A-B (20 分)

本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。

输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过10
​4
​​ ,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:
在一行中打印出A−B的结果字符串。

输入样例:
I love GPLT! It’s a fun game!
aeiou
输出样例:
I lv GPLT! It’s fn gm!

#include<stdio.h>
#include<string.h>
int main()
{
	int i=0,j=0;			//用于循环和数组下标
	char str1[10010];		//用来存储A、B两个字符串
	char str2[10010];		//用来存储要删除的字符串字母
	int length;				//用来存储字符串长度
	gets(str1);
	gets(str2);
	length = strlen(str2);	//这里只需要记住str2字符串的长度即可
	while(str1[i]!='\0')	//将str1字符串从第一个字母开始带进去一一查验
	{
		for(j=0;j<length;j++)//将这个字母放到str2中一一查询是否有对应的,若有对应的
		{					//那么for循环就会提前跳出,并且j的值不可能会等于length,
			if(str1[i]==str2[j])//记住关键词,提前!所以从这里就可以肯定若for循环执行
				break;			//到了最后,那么证明这个字母在str2中是找不到对应的,
		}						//那么自然需要显示啦!
		if(j==length)
			printf("%c",str1[i]);
		i++;
	}
	printf("\n");
	return 0;
}

117、猜数字 (20 分)

一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。

输入格式:
输入在第一行给出一个正整数N(≤10
​4
​​ )。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。

输出格式:
在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。

输入样例:
7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62
输出样例:
22 Amy

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct E{
char name[11];
int num;
}a[10001];
int main(){
    int n,sum=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s%d",a[i].name,&a[i].num);
        sum+=a[i].num;
    }
    int avg=(sum/n)/2,minm=11111,tag;
    for(int i=0;i<n;i++){
        if(abs(avg-a[i].num)<minm){
            minm=abs(avg-a[i].num);
            tag=i;
        }
    }
    printf("%d %s\n",avg,a[tag].name);
    return 0;
}

118、40059 四则运算 (15 分)

编写一个不考虑优先级的,能够进行加、减、乘、除四则运算的袖珍计算器。

输入格式:
如:键盘输入 10.83+0.10/10= 。

输出格式:
程序计算后输出结果1.093000(运算式子以‘=’结尾)。

输入样例:
34.5-2.4*3.1/11=
输出样例:
9.722727

#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int i,j;
	double num1,num2;
	char c;
	scanf("%lf",&num1);
	for(i=0;;i++)
	{
		scanf("%c",&c);
		if(c=='=')
		break;
		scanf("%lf",&num2);
		if(c=='-')
			num1-=num2;
		else if(c=='+')
			num1+=num2;
		else if(c=='*')
			num1*=num2;
		else if(c=='/')
		{
//			if(num2==0)
//				num1=0;
//			else
			num1/=num2;
		}
	}
		printf("%lf\n",num1);
		return 0;
}

119、宿舍谁最高? (20 分)

学校选拔篮球队员,每间宿舍最多有4个人。现给出宿舍列表,请找出每个宿舍最高的同学。定义一个学生类Student,有身高height,体重weight等。

输入格式:
首先输入一个整型数n (1<=n<=1000000),表示n位同学。
紧跟着n行输入,每一行格式为:宿舍号,name,height,weight。
宿舍号的区间为[0,999999], name 由字母组成,长度小于16,height,weight为正整数。

输出格式:
按宿舍号从小到大排序,输出每间宿舍身高最高的同学信息。题目保证每间宿舍只有一位身高最高的同学。

输入样例:
7
000000 Tom 175 120
000001 Jack 180 130
000001 Hale 160 140
000000 Marry 160 120
000000 Jerry 165 110
000003 ETAF 183 145
000001 Mickey 170 115
输出样例:
000000 Tom 175 120
000001 Jack 180 130
000003 ETAF 183 145

#include<math.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Student{
	int number;
	char name[18];
	int height;
	int weight;
}stu[10010]={0};
int main()
{
	int n;
	int i;
	char temp1[20];
	int index[100],k=0;
	int temp2;
	int number_new;
	char name_new[18];
	int height_new;
	int weight_new;

	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d%s%d%d",&number_new,&name_new,&height_new,&weight_new);
		index[k++]=number_new;
		if(stu[number_new].height == 0)		//利用序号找身高是否有存过值
		{
			stu[number_new].number=number_new;
			strcpy(stu[number_new].name,name_new);
			stu[number_new].height=height_new;
			stu[number_new].weight=weight_new;
		}
		else
		{
			if(height_new>stu[number_new].height)
			{
				stu[number_new].number=number_new;
				strcpy(stu[number_new].name,name_new);
				stu[number_new].height=height_new;
				stu[number_new].weight=weight_new;
			}
		}
	}
	//printf("\n");
	for(i=0;i<k;i++)
	{
		if(stu[index[i]].number!=-1)
		{
		printf("%06d %s %d %d\n",stu[index[i]].number,stu[index[i]].name,stu[index[i]].height,stu[index[i]].weight);
		stu[index[i]].number=-1;
		}
	}
	//printf("%06d %s %d %d\n",stu[0].number,stu[0].name,stu[0].height,stu[0].weight);
	return 0;
}

120、阶梯电价 (15 分)

为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。

输入格式:
输入在一行中给出某用户的月用电量(单位:千瓦时)。

输出格式:
在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"。

输入样例1:
10
输出样例1:
cost = 5.30
输入样例2:
100
输出样例2:
cost = 55.50

#include<stdio.h>
int main()
{
	double n;
	scanf("%lf",&n);
	if(n<0)
		printf("Invalid Value!\n");
	else if(n<=50)
		printf("cost = %.2lf\n",n*0.53);
	else if(n>50)
		printf("cost = %.2lf\n",(50*0.53+(n-50)*0.05));
	return 0;
}

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王睿丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值