我有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
,它怎么能返回打印件?有可能吗?
答案 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.
仔细看看,如果您有任何疑问,或者我误解了您的需求,请告诉我。