あなたが正しくしたいことを理解していれば、この機能を熟考しているかもしれません。 が一意の max sumを含む行の行インデックスを返すだけの場合、またはmax sumが非一意でない場合はno unique max.
を出力するだけで、ネストされたループの単一のセットを使用して配列を1回だけ繰り返すだけです。
あなたも、それが発生した行のインデックスと一緒に戻ってあなたの呼び出し元の関数(ここでは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 */
}
(注:あなたは、単にmsum
パラメータにNULL
を渡し、呼び出し元で利用可能な最大の和を持っていることについて気にしない場合)
短いテストプログラムは次のようなものです。単に非ユニーク最大和のための機能の動作をテストするために、第2行のコメントを解除:
#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.
質問がある場合、または私があなたのニーズを誤解した場合は、それを見て、私に知らせてください。
'printf()'は印刷された文字数を返すので、戻り値を返すことができますが、おそらくあなたが望むものではありません。 –
あなたは[配列内の最大数をカウントする方法]を尋ねた[kayan](https://stackoverflow.com/users/6457718/kayan)と同じ問題に取り組んでいますか(https://stackoverflow.com/questions/37780992 /)。違いはありますが、コードのいくつかは非常に似ています。そこにコメントとして書き留めたように、配列を一回通過する回数が最大になる回数をカウントできるはずです。現在の値が現在の最大値より大きい場合は、新しい最大値を記録し、カウントを1に設定するか、現在の値が現在の最大値と等しい場合は、カウントに1を加算します。 –
ネストされたループの2番目のセットに割り当てられた 'if(k = row_max)'というバグがあります。おそらく 'if(k == row_max)'が必要です。 –