【问题标题】:Find maximum size of a 2d array查找二维数组的最大大小
【发布时间】:2014-12-16 19:40:45
【问题描述】:

我被要求用 C 语言创建一个程序,其中将采用例如二维数组。 3 个数字,每次乘以一个数字,直到我们只得到一个数字。然后每个数字的结果将被归档到数组的第二行。

例如。

例如,数字 2736 的持久性是 0:首先我们找到 2 * 7 * 1 * 6 = 252,然后是 2 * 5 * 2 = 20,最后是 2 * 0 = 0,我们找到一个数字。 (在该示例中为 0)。

数组的数字将从具有以下格式的 txt 文件中给出:

2716 2720

所以数字将是[2716,2720] : 2176 2177 2178 2179 21720

每个持久性的图形表示将是

Number | Persist
-----------------
  2716  |    3
  2717  |    4
  2718  |    2
  2719  |    3
  2720  |    1

之后的数组将是:

 array[5][2] = { {2716,3}, {2717,4}, {2718,2}, {2719,3}, {2720,1} };

所以最后我需要找到具有最大持久性的数字(在我的情况下是 2717)并将其 fprintf 到一个名为 persist.out 的 txt 文件中,其中行和列如下:

2717 4

我的问题是在复制数组的最后一部分。

我们还需要检查是否有多个数字具有较大的持久性,然后找到最大数字。

我为最后一部分写了一个代码,但不是很稳定,我无法进行我想要的检查。

更新!

#include <stdio.h>

int multiply_digits(int x)
{
  int z = 1;
  while ( x )
  {
    z *= x % 10;
    x /= 10;
  }

  return z;
}



int main() {

    int a;
    int b;

    FILE *input, *output;

    input = fopen("persist.in","r");
    fscanf(input,"%d %d",&a, &b);
    fclose(input);


    int c = (b - a) + 1;

    int array[c][2];



    array[0][0] = a;

    for(int i = 1; i < c; i++)
    {

        array[i][0] = a + i;

    }



     int i, j;
    for (i=0; i< c; ++i)
    {
        int n = array[i][0];
        int j = 0;
            while (n>9)
            {
            n = multiply_digits(n);
            j++;
            }
        array[i][1] = j;
    }



    for (i = 0; i < c; i++)
    {
        for (j = 0; j < 2; j++)
        {
       printf("%d ", array[i][j]);
        }
    printf("\n");
    }

    printf("\n");

    int indexOfMaximum;
    int maximum = array[0][1];
    for (i = 0 ; i < c ; ++i ) 
    {

      if ( array[i][1] >= maximum ) {
    maximum = array[i][1];
    indexOfMaximum = i;
    }
    } 


}

【问题讨论】:

  • 问题是什么?
  • 如何找到具有最大持久性的数字以及如何将其行和列复制到txt文件中
  • 你必须检查fopen的结果。
  • 别担心

标签: c arrays 2d


【解决方案1】:

在您的 for 循环中,您的停止条件是 i &lt;= c 它应该是 i &lt; c,因为您的开始索引是 0

您的数组被声明为int array[c][2],因此您正在读取数组末尾的内容@。

至于写入文件部分就行了

fprintf(output, "%d %d\n", array[indexOfMaximum][0], array[indexOfMaximum][1]);

希望对你有帮助。

【讨论】:

  • 好吧,也许你是对的,但我的代码有效,我的问题是另一个问题。另外,如果我输入i &lt; c,那么我会错过最后一个数字
  • 如果您的代码有效,那是偶然的。你修复它并尝试了吗?
  • 我的意思是你正在读取数组,之前的值应该没问题,但是在你找到最大的部分,它会造成麻烦。
  • @GeorgeGkas 认真的吗?对于声明为暗淡[n] 的数组,C 允许从0..(n-1) 进行索引。你的程序格式不正确。你是否选择相信这无关紧要;它仍然是真实的。从格式错误的程序中得出的最常见的错误结论是认为观察到的行为是定义的行为。一是赌博;一个按规则行事。你的是前者。老实说就是这么简单;信仰与它无关。
  • 可能是,你应该在for循环之前初始化indexOfMaximum,否则它可能最终没有初始化,你为什么不测试代码看看它是否有效?
【解决方案2】:

您需要将最后一个 if 语句中的条件更改为 >= 以便实际获得最大值。如果较大的持久性多次出现,则使用您的代码,您只会找到第一个。

if ( array[i][1] >= maximum ) {
    maximum = array[i][1];
    indexOfMaximum = i;
}

【讨论】:

  • 检查!但同样在那种情况下,我怎样才能检查在那种情况下找到更大的数字?
  • 编辑了答案。只需使用变量 indexOfMaximum ,最后你的 2 个值是 array[indexOfMaximum][0] 和 array[indexOfMaximum][1]
  • 我更新了我的问题,但我无法理解您的回答。请检查一下!
  • 您的数组被越来越多地排序,在 for 循环结束时,array[indexOfMaximum][0] 中的数字将是具有最高持久值的最大数字。如果 X 有一个 persist = p 并且 Y > X 有一个 persist 也等于 p,那么 Y 在循环中的 X 之后,并且当 p >= p 为真时 indexOfMaximum 将成为 Y 的索引。更清晰?
猜你喜欢
  • 2015-04-06
  • 2019-03-31
  • 2014-03-05
  • 2021-10-07
  • 2017-07-23
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多