【XDOJ】C语言期末真题带练及思路分析
【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;
}
}
}//检索列
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!