- ベストアンサー
配列における数値の比較について
#include <stdio.h> int main(void) { int i[10],j,k,match; printf("10個の数字を入力してください:\n"); for(j=0;j<10;j++) scanf("%d",&i[j]); // 一致する数字があるかどうか調べる // for(j=0;j<10;j++){ match=i[j]; for(k=j+1;k<10;k++) if(match==i[k]) printf("%dが重複しています\n",match); } return 0; } このコードなのですが、一致する数字があるかどうか調べているところの、 for(k=j+1;k<10;k++) このコードの内容が理解できません。 特にkの初期値が k=j+1 になっているのはなぜなのでしょうか? 配列i[j]には1から9までの数値が格納されているので、それと一致する数値を見つけ出すには for(k=0;k<10;k++) と同じことをすればよいのではないでしょうか? アルゴリズムがどうしても分かりません。 どなたか教えてくださる方がいたらよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
i[j]は比較元、i[k]は比較先だからです。 j=0のときi[0]と重複する数字があるかどうか調べるための比較先はi[1]~i[9]ですよね。 だからkはj+1~9でないと成り立ちません。 hisa_a10さんが考えている for(k=0;k<10;k++) にしてしまうと、j==kというループ回のときに比較元と比較先が同一になってしまって、全て重複ありという解答になってしまいます。 これ、初心者が結構陥りやすいバグの元だったりします。
その他の回答 (2)
- moritan2
- ベストアンサー率25% (168/670)
jとkで表を作って考えれば一目でわかります。 j=kは絶対に同じ値なので飛ばさなくてはならないし、たとえばj=2、k=3を調べたらj=3、k=2は必要ありません。 0123456789 0×○○○○○○○○○ 1××○○○○○○○○ 2×××○○○○○○○ 3××××○○○○○○ 4×××××○○○○○ 5××××××○○○○ 6×××××××○○○ 7××××××××○○ 8×××××××××○ 9×××××××××× ○のところだけ調べればいいので、ご質問のプログラムは正しいわけです。
お礼
回答していただいてありがとうございます。 記載していただいた表を見てすぐに理解することができました。 j=k以外の数値を比較対象にすればいいというわけですね。 ありがとうございました。
- floor101
- ベストアンサー率28% (2/7)
現在のループ変数 j の前の i[j - 1] については、 重複がない事が既に分かっているので、現在は i[j] よりも後ろの配列だけを調べればよい事になります。 従って k = j + 1 になっているのだと思います。こう すると検索に要する時間が短くなります。
お礼
回答していただいてありがとうございます。 私はi[j]と同じ数値を比較していたのですね。 だからi[j]以降の数値を比較すればよいということですね。 ありがとうございました。
お礼
回答していただいてありがとうございます。 おかげさまで理解することができました。 i[j]と重複する数値を調べるにはi[j]自身以外の数値と比較すればいい、つまりi[j]に1を足した数値から比較していけばいいということですね。 またお世話になるときがあったら、その時はよろしくお願いします。