1183: 零起点学算法90——海选女主角(C语言)

本文介绍了一道ACM编程题的解析与代码实现,目标是在多组输入的二维数组中找到绝对值最大的元素,并记录其位置。通过两次代码提交的错误与修正过程,最终实现了正确的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目

http://acm.wust.edu.cn/problem.php?id=1183&soj=0

二、分析

  1. 从描述来看,就是找出一个二维数组中绝对值最大的数;
  2. 带符号的32位整数,刚好是int型的表示范围;
  3. 0<n,m<100,说明二维数组大小为99*99;
  4. 多组输入;
  5. 边输入边判断大小,缩短时间;
  6. 用x,y记录绝对值最大的下标(数组从[0][0]开始);
  7. 输出时,x,y要加1。

三、代码

1、第一次提交

第一次提交代码

结果:Runtime Error。

原因:数组越界。

解决方法:数组a应该定义为100*100的。

疑问:题目是0<n,m<100,我觉得应该是99*99,搞不懂为什么越界了。

2、第二次提交

1183:第二次提交代码

结果:Accepted(正确)。

疑问:题目明确最小数为-2147483648,而int型的范围是-2147483648~2147483647,但是abs返回的是int型数据,求绝对值时超过了范围,不知道为什么提交是对的。

解决方法:稳妥起见将abs换成fabs,fabs返回的是double型的。

运行截图:

1183:第二次运行截图

3、第三次提交

#include<stdio.h>
#include<math.h>
int main() {
	int m, n, a[100][100], x, y, i, j;
	while (scanf("%d%d", &m, &n) != EOF) {
		x = 0, y = 0; // 初始化为第一个数绝对值最大
		for (i = 0; i < m; i++) {
			for (j = 0; j < n; j++) {
				scanf("%d", &a[i][j]); // 输入m*n个数
				if (fabs(a[x][y]) < fabs(a[i][j])) { // 如果当前数绝对值比之前的最大值大
					x = i; // 记录下标
					y = j;
				}
			}
		}
		printf("%d %d %d\n", x + 1, y + 1, a[x][y]); // 输出x,y要加1
	}
	return 0;
}

结果:Accepted(正确)

运行截图:

1183:运行截图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值