配列における数値の比較について

解決済みの質問

配列における数値の比較について

#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++)

と同じことをすればよいのではないでしょうか?

アルゴリズムがどうしても分かりません。
どなたか教えてくださる方がいたらよろしくお願いします。

投稿日時 - 2006-05-05 22:51:51

連想キーワード:

QNo.2133221

すぐに回答ほしいです

質問者が選んだベストアンサー

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というループ回のときに比較元と比較先が同一になってしまって、全て重複ありという解答になってしまいます。

これ、初心者が結構陥りやすいバグの元だったりします。

投稿日時 - 2006-05-06 00:14:51

お礼

回答していただいてありがとうございます。

おかげさまで理解することができました。

i[j]と重複する数値を調べるにはi[j]自身以外の数値と比較すればいい、つまりi[j]に1を足した数値から比較していけばいいということですね。

またお世話になるときがあったら、その時はよろしくお願いします。

投稿日時 - 2006-05-06 22:14:19

ANo.2

0人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(2件中 1~2件目)

ANo.3

jとkで表を作って考えれば一目でわかります。
j=kは絶対に同じ値なので飛ばさなくてはならないし、たとえばj=2、k=3を調べたらj=3、k=2は必要ありません。

 0123456789
0×○○○○○○○○○
1××○○○○○○○○
2×××○○○○○○○
3××××○○○○○○
4×××××○○○○○
5××××××○○○○
6×××××××○○○
7××××××××○○
8×××××××××○
9××××××××××

○のところだけ調べればいいので、ご質問のプログラムは正しいわけです。

投稿日時 - 2006-05-06 08:40:52

お礼

回答していただいてありがとうございます。

記載していただいた表を見てすぐに理解することができました。

j=k以外の数値を比較対象にすればいいというわけですね。

ありがとうございました。

投稿日時 - 2006-05-06 22:31:48

ANo.1

現在のループ変数 j の前の i[j - 1] については、
重複がない事が既に分かっているので、現在は i[j]
よりも後ろの配列だけを調べればよい事になります。

従って k = j + 1 になっているのだと思います。こう
すると検索に要する時間が短くなります。

投稿日時 - 2006-05-05 23:10:29

お礼

回答していただいてありがとうございます。

私はi[j]と同じ数値を比較していたのですね。
だからi[j]以降の数値を比較すればよいということですね。

ありがとうございました。

投稿日時 - 2006-05-06 22:47:30

あわせてチェックしたい
  • \"%s\"の使いかたについて ...
  • C言語 ...
  • insert into $DB (data1, data2) values (\"$data1\", \"$data2\")で変数扱いされません ...
PR

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら