解決済みの質問
#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
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
0人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(2件中 1~2件目)
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
OKWaveのオススメ
おすすめリンク