アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

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

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

これ、初心者が結構陥りやすいバグの元だったりします。
    • good
    • 0
この回答へのお礼

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

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

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

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

お礼日時:2006/05/06 22:14

jとkで表を作って考えれば一目でわかります。


j=kは絶対に同じ値なので飛ばさなくてはならないし、たとえばj=2、k=3を調べたらj=3、k=2は必要ありません。

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

○のところだけ調べればいいので、ご質問のプログラムは正しいわけです。
    • good
    • 0
この回答へのお礼

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

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

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

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

お礼日時:2006/05/06 22:31

現在のループ変数 j の前の i[j - 1] については、


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

従って k = j + 1 になっているのだと思います。こう
すると検索に要する時間が短くなります。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2006/05/06 22:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!