【XDOJ】C语言期末真题带练及思路分析

发布时间:2024年01月09日

【XDOJ】C语言期末真题带练及思路分析

2021真题

爬山

小明最近参加了一个登山俱乐部,部长给了他一个包含n*m格子的地图,其中地图上的每个格子表示一座山的高度。小明现在位于位置(x,y),他想要登上地图上最高的山顶,所以他想知道爬上最高的山顶还需要向上爬多少米?
例如,地图如下所示
x\y 1 2 3
1 100 130 150
2 200 300 100
3 100 150 50
现在小明位于(2,1),那么小明当前所处的海拔高度为200米,由地图可知最高的山峰海拔为300米,那么小明想要爬上最高的山峰还需要爬100米。

#include <stdio.h>

int main() {
	int n, m, i, j, max = 0, t, x, y;
	scanf("%d %d", &n, &m);//输入地图大小
	int a[100][100];
	for (i = 0; i < n; i++) {
		for (j = 0; j < m; j++) {
			scanf("%d ", &a[i][j]);
			if (a[i][j] > max)
				max = a[i][j];
		}
	}//得到最大高度
	scanf("%d %d", &x, &y);
	t = max - a[x - 1][y - 1];//注意下角标
	printf("%d", t);
	printf("\n");
	for (i = 0; i < n; i++) {
		for (j = 0; j < m; j++) {
			if (a[i][j] == max)
				printf("(%d,%d) ", i + 1, j + 1);
		}
	}//遍历输出最大值
}
  • 数列,矩阵题要尤其注意下角标

职员评优

某公司职员的工资收入由基本工资、绩效奖励和扣罚金额构成,实发工资为基本工资+绩效奖励-扣罚金额,对于m(0<m≤20)名职员的工资信息,编程计算所有职员的实发工资平均数W,然后输出绩效奖励高于W的所有职员(Outstanding),最后输出扣罚金额为0(Non-Fault)的职员工号。

#include <stdio.h>

struct work {
	int a, b, c, d;
};

int main() {
	int m, i, w = 0, j = 0, k = 0;
	scanf("%d", &m); //员工数目为m
	struct work per[m];
	for (i = 0; i < m; i++) {
		scanf("%d %d %d %d", &per[i].a, &per[i].b, &per[i].c, &per[i].d);
		w += per[i].b + per[i].c - per[i].d;
	}
	w /= m;
	printf("%d\n", w);
	printf("Outstanding: ");
	for (i = 0; i < m; i++) {
		if (per[i].c > w) {
			printf("%d ", per[i].a);
			j++;
		}
	}
	if (j == 0)
		printf("none\n");
	else
		printf("\n");
	printf("Non-Fault: ");
	for (i = 0; i < m; i++) {
		if (per[i].d == 0) {
			printf("%d ", per[i].a);
			k++;
		}
	}
	if (k == 0)
		printf("none");
}

2019真题

以下仅展示核心代码

平方排序

如果两数字的平方数相等,则原本数字值更大的先输出。
如给定n=4个整数-3043,则其平方数分别为90169,又因为3>-3,所以最终输出为43-30。

for (i=0;i<n;i++)
	{
		result[i]=pow(num[i],0.5);
		if(result[i]==result[i-1])
		{
			result[i]*=-1;
		}
	}

矩阵输出

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

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])
			{
				printf("%d %d %d\n",a[i][j],i,j);
				judge=1;
			}

查找矩阵元素

找出一个m×n的矩阵中,在行上最大而在列上最小的元素,输出它的位置。

for(i=1;i<=m;i++)
	{
		max[i]=0;
		for(j=0;j<=n;j++)
		{
			if(num[i][j]>max[i])
			{
				max[i]=num[i][j];
			}
		}
	}
	for(j=0;j<=n;j++)
	{
		min[j]=10000;
		for(i=1;i<=m;i++)
		{
			if(num[i][j]<min[j])
			{
				min[j]=num[i][j];
			}
		}
	}

数值辨别分析

两个正整数m和n(1000≤m <n<10,000),统计区间[m,n]范围内(含端点),分别满足条件的数字个数。条件:1. 能被3整除,但不能被5整除的数字;2. 不能被4整除,且余数为1的数字;3. 十位与千位之和大于10的数字;4. 个位为5,或十位与千位之积小于35的数字。

a=i%100/10;//十位 
b=i%/1000;//千位 

矩阵元素置0

将一个矩阵中,所有包含0的行和列元素都置为零,其他位置的元素值不变。

for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			if(num[i][j]==0)
			{
				x++;
				sum_i[x]=i;
				sum_j[x]=j;
			}
		}
	}//找到含0元素的行或列 
	for(i=0;i<m;i++)
	{
		for(k=1;k<=x;k++)
		{
			if(i==sum_i[k])
			{
				for(j=0;j<n;j++)
				{
					num[i][j]=0;
				}
				break;
			}
		}
	}//检索行 
	for(j=0;j<n;j++)
	{
		for(k=1;k<=x;k++)
		{
			if(j==sum_j[k])
			{
				for(i=0;i<m;i++)
				{
					num[i][j]=0;
				}
				break;
			}
		}
	}//检索列 
文章来源:https://blog.csdn.net/Chole_Waston/article/details/135441261
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。