如何在2D数组中找到哪一行具有最大的总和?

时间:2016-06-13 00:08:42

标签: c

我有2D数组,我需要编写一个函数来查找哪一行具有最大的总和,如果有多个行具有相同的总和,我需要打印没有特定的最大值。这是我到目前为止写的:

int find_max_sum(int b[N][N])
{
    int row_sum = 0;
    int row_max = -1;
    int i,j,k;
    int counter=0;
    for(int i =0;i<N;i++)
    {
        row_sum = 0;
        for (j = 0; j < N; ++j)
        {
            row_sum +=  b[i][j] ;
        }
        if(row_max < row_sum)
        {
            row_max = row_sum;
        }
    }
    for (i = 0; i < N; i++)
    {
       for (j= 0;j< N;j++)
       {
           if(k=row_max);
           counter++;
       }
    }
    if (counter>1)
        return(printf("No unique max.\n"));
    else
        return row_max;
}

现在我需要有关计数器的帮助,如果函数是int,它怎么能返回打印件?有可能吗?

3 个答案:

答案 0 :(得分:1)

以下是一个例子。

#include <stdio.h>
#include <stdbool.h>

#define N 2
#define NO_UNIQUE -1

int find_max_sum(int b[][N])
{
    int row_sum, i, j;
    int row_max = -1;
    bool unique = false;

    for (i = 0; i < N; ++i) {
        row_sum = 0;
        for (j = 0; j < N; ++j)
            row_sum += b[i][j];

        if (row_max < row_sum) {
            row_max = row_sum;
            unique = true;
        } else if (row_max == row_sum)
            unique = false;
    }

    if (unique)
        return row_max;
    else {
        printf("No unique max.\n");
        return NO_UNIQUE;
    }
}

int main(void)
{
    int b[N][N] = {1, 2, 3, 4};

    printf("Max sum is %d\n", find_max_sum(b));

    return 0;
}

答案 1 :(得分:0)

我建议您使用第三个变量(我们称之为rowsWithMaxCount)来存储具有当前最大值的行数,以便:

  • 如果您找到一个新的最大行,然后rowsWithMaxCount = 1
  • 如果您找到row_max == row_sum然后++rowsWithMaxCount
  • 的行
  • 否则rowsWithMaxCount不受影响

这样可以避免循环使用二维数组,这会浪费代码,因为只需遍历一次数组就可以获得所需的所有信息。

“返回printf”没有任何意义,如果你声明函数返回int则不可能,那么你必须返回int。考虑使用特殊值来通知呼叫者没有唯一的最大值。例如,假设值始终为正:

static const int NO_UNIQUE_MAX = -1;

int find_max_sum(int b[N][N]) {
  ...
  if (counter > 1)
    return NO_UNIQUE_MAX;
  ...
}

但这会阻止您返回非唯一的最大值。如果您需要返回两者,那么您可以声明一个新类型,例如

struct MaxRowStatus {
  int value;
  int count;
};

这样您就可以从函数中精确返回两个值。

答案 2 :(得分:0)

如果我理解你想要什么,你可能会过度思考这个功能。如果您只想返回包含唯一最大总和的行的行索引,或者如果最大总和不唯一则打印no unique max.,那么您只需要通过一次迭代使用一组嵌套循环的数组。

您甚至可以将指针作为参数传递给函数,以使 max sum 在您的调用函数(此处为main())中可用,以及其中的行的索引它发生了。跟踪唯一性的最简单方法是保持切换(0, 1)跟踪总和的状态。

一个例子是:

int maxrow (int (*a)[NCOL], size_t n, long *msum)
{
    long max = 0;
    size_t i, j, idx = 0, u = 1;

    for (i = 0; i < n; i++) {       /* for each row     */
        long sum = 0;
        for (j = 0; j < NCOL; j++)  /* compute row sum  */
            sum += a[i][j];
        if (sum == max) u = 0;      /* if dup, unique 0 */
        if (sum > max)   /* if new max, save idx, u = 1 */
            max = sum, idx = i, u = 1;
    }
    if (u) {    /* if unique, update msum, return index */
        if (msum) *msum = max;
        return idx;
    }
    fprintf (stderr, "no unique max.\n");
    return -1;  /* return -1 if non-unique */
}

注意:,如果您不关心调用者可以获得最大总和,只需将NULL传递给msum

简短的测试计划可能如下。只需取消注释第二行,即可测试非唯一最大和的函数行为:

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

enum { NCOL = 7 };

int maxrow (int (*a)[NCOL], size_t n, long *msum)
{
    long max = 0;
    size_t i, j, idx = 0, u = 1;

    for (i = 0; i < n; i++) {       /* for each row     */
        long sum = 0;
        for (j = 0; j < NCOL; j++)  /* compute row sum  */
            sum += a[i][j];
        if (sum == max) u = 0;      /* if dup, unique 0 */
        if (sum > max)   /* if new max, save idx, u = 1 */
            max = sum, idx = i, u = 1;
    }
    if (u) {    /* if unique, update msum, return index */
        if (msum) *msum = max;
        return idx;
    }
    fprintf (stderr, "no unique max.\n");
    return -1;  /* return -1 if non-unique */
}

int main (void) {

    int a[][7] = {{ 0, 9, 3, 6, 4, 8, 3 },
            /* { 3, 9, 2, 7, 9, 1, 6 }, uncomment for test */
                { 6, 1, 5, 2, 6, 3, 4 },
                { 4, 3, 3, 8, 1, 2, 5 },
                { 3, 9, 2, 7, 9, 1, 6 }},
        maxidx;
    long sum = 0;
    size_t nrow = sizeof a/sizeof *a;

    if ((maxidx = maxrow (a, nrow, &sum)) != -1)
        printf (" max sum '%ld' occurs at row : %d  (0 - indexed).\n",
                sum, maxidx);

    return 0;
}

示例使用/输出

对于唯一的总和案例:

$ ./array2Drow
 max sum '37' occurs at row : 3  (0 - indexed).

非独特案例:

$ ./array2Drow
no unique max.

仔细看看,如果您有任何疑问,或者我误解了您的需求,请告诉我。