不枉风来水顺 发表于 2023-11-1 10:20:37

help me!

here is the problem:
在一个nXn的二维整数数组中,每一行都有一个最小值,这n个最小值中有一个最大的。请写一段程序找出这个最大的最小值。

输入格式:
第一行为一个整数n,1<=n<=10,后边为n行,是nXn个整数(以空格分隔),即nXn的二维整数数组。

输出格式:
只有一行为三个整数,依次为这个最大的最小值及它所在行和列的下标(分别以一个空格分隔。如果某行的最小值出现多次,则要求记录列下标最小的那个,如果最大的最小值出现多次,则要求记录下标最小的那行)。测试数据保证所有整数均可以用int型存储。

输入样例:
3
1 2 3
4 5 6
7 8 9

输出样例:
7 2 0

here is my program:
#include<stdio.h>

int main()
{
        int n; scanf("%d",&n);//define the n_X_n nums
        int nums;
        int min = 1024 ,max_min = 0;
        int index_i,index_j;

        for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                        scanf("%d",&nums);
                }
        }


        for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                        if(nums < min){
                                min = nums;
                        }       
                        if(min > max_min){
                                max_min = min;
                                int index_i = i;
                                int index_j = j;
                        }
                }
        }
       
        printf("%d %d %d",max_min,index_i,index_j);
        return 0;
}

what should i do?

isdkz 发表于 2023-11-1 10:20:50

你的程序有一些问题。首先,在找到最大的最小值时,你应该将 index_i 和 index_j 定义为全局变量,而不是在 if 语句中重新定义。其次,你在每个元素迭代时都会更新 min 和 max_min 的值,这是不正确的。你应该在每一行迭代结束后更新 max_min 的值。最后,你初始化 min 的值为1024,但是题目中没有给出这个限制,所以你应该将其初始化为第一个元素的值。

以下是修改后的代码:

#include <stdio.h>

int index_i, index_j;

int main()
{
    int n;
    scanf("%d", &n);

    int nums;
    int min, max_min;

    for (int i = 0; i < n; i++)
    {
      for (int j = 0; j < n; j++)
      {
            scanf("%d", &nums[ i]);
      }
    }

    min = nums;
    max_min = min;
    index_i = 0;
    index_j = 0;

    for (int i = 0; i < n; i++)
    {
      min = nums[ i];

      for (int j = 0; j < n; j++)
      {
            if (nums[ i] < min)
            {
                min = nums[ i];
            }
      }

      if (min > max_min)
      {
            max_min = min;
            index_i = i;
            index_j = 0;
      }
    }

    printf("%d %d %d", max_min, index_i, index_j);
    return 0;
}


这样,你的程序应该能够正确地找到最大的最小值以及它所在的行和列的下标。

Mike_python小 发表于 2023-11-1 10:22:15

问题分析:

根据你的描述,你想要编写一个程序,在一个 n×n 的二维整数数组中找到最大的最小值,并输出该值及其所在行和列的下标。你已经尝试编写了代码,但似乎遇到了一些问题。

代码分析:

在你的代码中,存在一些问题:

1. 数组 nums 的大小在编译时需要是一个常量。C 语言不支持变长数组(VLA),因此你不能使用变量 n 来定义 nums 数组。可以考虑使用动态内存分配(malloc 函数)来解决这个问题。

2. 在找到最大的最小值时,你应该保存最小值出现的行和列的下标,而不是每次都更新 index_i 和 index_j。另外,你在保存下标时,不需要再次声明 int index_i = i; 和 int index_j = j;,直接赋值即可。

修改建议:

下面是修改后的代码,修复了上述问题:


#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    scanf("%d", &n);// 定义 n
    int nums = (int)malloc(n * sizeof(int*));// 动态分配内存
    for (int i = 0; i < n; i++) {
      nums = (int*)malloc(n * sizeof(int));
    }

    int min = 1024, max_min = 0;
    int index_i, index_j;

    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
            scanf("%d", &nums);
      }
    }

    for (int i = 0; i < n; i++) {
      int current_min = nums;// 初始化当前行的最小值为第一个元素
      int current_j = 0;// 记录当前行最小值所在的列下标

      for (int j = 1; j < n; j++) {
            if (nums < current_min) {
                current_min = nums;
                current_j = j;
            }
      }

      if (current_min > max_min) {
            max_min = current_min;
            index_i = i;
            index_j = current_j;
      }
    }

    printf("%d %d %d", max_min, index_i, index_j);

    // 释放动态分配的内存
    for (int i = 0; i < n; i++) {
      free(nums);
    }
    free(nums);

    return 0;
}


修改后的代码使用动态内存分配来创建二维数组 nums,并在释放内存时进行了相应的处理。在找到每一行的最小值时,只在当前行内部进行记录,并与当前的最大最小值比较。

希望能帮到你!

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: help me!