XDOJ2019年期末试题第一组


第一组

坐标判断

第一组
试题名称	1-1坐标判断
问题描述	
极坐标是表示二维点坐标的一种方式,其定义如下:
在平面内取原点作为极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(取逆时针方向,顺时针方向为负值)。对于平面内任何一点M,用r表示线段OM的长度(r≥0),a表示从Ox到OM的角度,r叫做点M的极径,a叫做点M的极角,有序数对(r, a)就叫点M的极坐标。

已知二维点M的极坐标(r, a),判断输入是否合理,即r是否非负,若输入合理,进一步判断点M落于原点、x轴、y轴还是第一///四象限。输出判断结果。
输入说明
输入为两个整数。第1个整数表示点M的极径r,0≤r<10000,第2个整数表示点M的极角a,-360≤a≤360,单位为度。

输出说明
若输入不合理,即r值不符合要求的取值范围,输出整数-1。
若输入合理,根据情况分别输出以下值
(1)若点M在原点,输出“Origin”;
(2)若M在X轴上,输出 “X-axis”;
(3)若M在Y轴上,输出 “Y-axis”;
(4)若M在第一象限,输出 “1st Quadrant”;
(5)若M在第二象限,输出 “2nd Quadrant”;
(6)若M在第三象限,输出 “3rd Quadrant”;
(7)若M在第四象限,输出 “4th Quadrant”。

测试样例:
	输入样例1
-20 45
输出样例1
-1
输入样例2
0 87
	输出样例2
Origin
输入样例3
10 180
	输出样例3
X-axis
输入样例4
10 45
	输出样例4
1st Quadrant
#include <stdio.h>
#include <math.h>
int main(){
	int r,a;
	scanf("%d %d",&r,&a);
	if(r<0){
		printf("-1"); 
	}else if(r==0){
		printf("Origin");
	}else if(r>0){
		int q;
		q = fabs(a);
		if(q==0||q==180||q==360){
			printf("X-axis");
		}else if(q==90||q==270){
			printf("Y-axis");
		}else{
			if((a>0&&a<90)||(a>-360&&a<-270) )printf("1st Quadrant");
         		else	if((a>90&&a<180)||(a>-270&&a<-180) ) printf("2st Quadrant");
         		else	if((a>180&&a<270)||(a>-180&&a<-90) ) printf("3st Quadrant");
         		else	if((a>270&&a<360)||(a>-90&&a<0) ) printf("4st Quadrant");
		}
	}
	return 0;
}

信息查询

试题名称	2-1信息查询
问题描述	
给出n(2<n<100)个学生个人信息类数据,分别查找n个学生信息中成绩最高(若多名学生成绩都是最高值,则取学号最大的学生)和年龄最小的学生(若多名学生年龄都是最小值,则取学号最小的学生)信息,并输出查询结果。

输入说明
输入多行信息,第一行输入整数n(2<n<100),表示n个学生的信息;接下来为n行,每行输入一个学生信息,包含年龄(15-30之间的整数)、学号(不超过8位的正整数)和成绩(0-100之间的整数),各项数据均为整数,且整数之间用一个空格分隔,所有学生的学号均不相同。

输出说明
输出为两行,第一行为成绩最高(若多名学生成绩都是最高值,则取学号最大的学生)的学生完整信息,输出各项数据之间用一个空格分隔;
第二行为年龄最小(若多名学生年龄都是最小值,则取学号最小的学生)的学生完整信息,输出各项数据之间用一个空格分隔。

测试样例:
	输入样例1
3
19 201907 85
20 201908 88
18 201909 81
输出样例1
20 201908 88
18 201909 81
输入样例2
4
19 2016 92
21 2017 88
20 2018 92
19 2019 62
	输出样例2
20 2018 92
19 2016 92
#include <stdio.h>
struct Student{
	int age;
	int num;
	int score;
}stu[100];
int main(){
	int n;
	scanf("%d",&n);
	int i = 0, j = 0;
	for(i=0;i<n;i++){
		scanf("%d %d %d",&stu[i].age,&stu[i].num,&stu[i].score);
	}
	struct Student temp;
	for(i = 0;i<n-1;i++){
		for(j = i;j<n;j++){
			if(stu[i].score<stu[j].score){
				temp = stu[i];
				stu[i]=stu[j];
				stu[j] = temp;
			}else if(stu[i].score==stu[j].score){
				if(stu[i].num<stu[j].num){
				temp = stu[i];
				stu[i]=stu[j];
				stu[j] = temp;}
			}
		}
	}
	printf("%d %d %d\n",stu[0].age,stu[0].num,stu[0].score);
		for(i = 0;i<n-1;i++){
		for(j = i;j<n;j++){
			if(stu[i].age>stu[j].age){
				temp = stu[i];
				stu[i]=stu[j];
				stu[j] = temp;
			}else if(stu[i].age==stu[j].age){
				if(stu[i].num>stu[j].num){
				temp = stu[i];
				stu[i]=stu[j];
				stu[j] = temp;}
			}
		}
	}
	printf("%d %d %d",stu[0].age,stu[0].num,stu[0].score);
	
	return 0;
}

数位统计

试题名称	3-1数位统计
问题描述	
对于n个正整数,编程统计这些整数中数位1出现的总次数。
如给定n=3个正整数1020 1100 9911,则这n个正整数中数位1出现的总次数为5次。

输入说明
输入分两行:
第一行为一个正整数n,0<n<100;
第二行为n个正整数,每个正整数都小于230,整数之间以空格分隔.

输出说明
输出n个正整数中数位1出现的总次数并换行。

测试样例:
	输入样例1
3
1020 1100 9911
输出样例1
5

输入样例2
5
1134 9033 1274 116 1000
	输出样例2
6
#include <stdio.h>
int main(){
	int n,count = 0;
	scanf("%d",&n);
	int a[100],i = 0;
	for(i = 0;i<n;i++){
		scanf("%d",&a[i]);
		while(a[i]!=0){
			if(a[i]%10==1){
			count++;
			}
			a[i]=a[i]/10;
					}
	}
	printf("%d",count);
	return 0;
}

矩阵判断

在这里插入代码片
4-1 矩阵判断
问题描述	
定义主对角线以下的元素都为0的矩阵为上三角矩阵,主对角线以上的元素都为0的矩阵为下三角矩阵,除了主对角线以外所有元素均为0的矩阵为正对角阵,以上均不包括主对角线元素。主对角线为从矩阵的左上角至右下角的连线(如下图红色连线的三个元素)。本题要求编写程序,判断一个给定的方阵是否为上、下三角矩阵或正对角阵。(不考虑所有元素均为0的矩阵。)

输入说明
每个矩阵信息的第一行给出一个正整数n(1<n<50),表示方阵行数和列数。随后n行,每行给出n个整数,其间以空格分隔,表示方阵各个元素。

输出说明
每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“UP”。如果输入的矩阵是下三角矩阵,输出“DOWN”。如果输入的矩阵是正对角阵,输出“PD”。如果以上三者均不满足,输出“NO”。
测试样例:
	输入样例13
1 2 3
0 4 5
0 0 6
输出样例1:
UP
输入样例22
1 0
-8 2
输出样例2:
DOWN
输入样例34
3 2 9 0
1 -4 5 6
6 7 -2 11
0 4 5 0
输出样例3:
NO
#include <stdio.h>
int main(){
	int n,m,i = 0,j = 0;
	scanf("%d",&n);
	int a[55][55];
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	int flag = 1,temp = 1;
	for(i=0,j=1;i<n,j<n-1;i++,j++){
		for(m=j;m<n;m++){
			if(a[i][m]!=0){
				flag = 0;
			}
			break;
		}
		if(flag==0) break;
	}
		for(i=n-1,j=n-2;i>=1,j>=0;i--,j--){
		for(m=j;m>=0;m--){
			if(a[i][m]!=0){
				temp = 0;
				break;
			}
		}
		if(temp==0) break;
	}
	if(flag==1&&temp==0) printf("DOWN");
    else if(flag==0&&temp==1) printf("UP");
    else if(flag ==1&&temp==1) printf("PD");
    else printf("NO");
	return 0;
}

优秀学生统计

在这里插入代码片试题名称	5-1优秀学生统计
问题描述	
给定N个学生的成绩信息,包括学号(不超过8位数的整数)和5门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的学号和总分,以及优秀学生人数,优秀学生的条件是至少有3门课均为优秀(成绩≥90)。

输入格式:
输入在一行中给出正整数N(0<N≤20)。随后N行,每行给出一位学生的成绩信息,格式为“学号成绩1 成绩2 成绩3成绩4成绩5”,中间以空格分隔。

输出格式:
在一行中输出总分最高学生的学号和总分,间隔一个空格。输入数据保证这样的学生是唯一的。
第二行输出优秀学生人数。

测试样例:
输入样例1
3
10001 78 93 75 55 60
10002 92 88 98 77 96
10003 87 83 56 45 58
输出样例1
10002 451
1

#include <stdio.h>
struct Student{
	int num;
	int score[5];
	int sum;
}stu[25];
int main(){
	int n,sum = 0;
	scanf("%d",&n);
	int i = 0,j = 0;
	for(i=0;i<n;i++){
		scanf("%d",&stu[i].num);
		for(j=0;j<5;j++){
			scanf("%d",&stu[i].score[j]);
			sum = sum+stu[i].score[j];
		}
		stu[i].sum = sum;
		sum = 0;
	}
	struct Student temp;
	for(i=0;i<n-1;i++){
		for(j=i;j<n;j++){
			if(stu[i].sum<stu[j].sum){
				temp = stu[i];
				stu[i]  = stu[j];
				stu[j] = temp;
			}
		}
	}
	printf("%d %d",stu[0].num,stu[0].sum);
	int count = 0,flag = 0;
	for(i=0;i<n;i++){
		flag = 0;
		for(j=0;j<5;j++){
			if(stu[i].score[j]>=90) flag++;
		}
		if(flag>=3) count++;
	}
	printf("\n%d",count);
	return 0;
}

码字不易,给个👍~我们下一篇博客见!

才疏学浅,个人理解难免有错,欢迎指正。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值