#include <stdio.h>
#define NUMBER 6
/*
* 比較回数を減らすために、すでに比較した要素の状態を配列に保存し、
* その要素の比較をスキップする。
* また、場合2と3におけるエラー処理を逐次的に行うことで複雑な処理を減らしている。
*/
int main()
{
int num[NUMBER] = {1, 6, 3, 1, 3, 6};
int count = 0;
// 場合1におけるエラー処理
if (NUMBER % 2 == 1)
{
printf("エラー:配列の要素数が奇数です\n");
return 1;
}
// すでに比較を行ったかを保存する配列
int seen[NUMBER] = {0};
// 比較を行う
for (int i = 0; i < NUMBER - 1; i++)
{
// すでに比較を行った要素の場合スキップ
if (seen[i] == 1)
continue;
printf("数値:%d インデックス:%d", num[i], i);
// 比較する要素の登場回数を保存する変数
int lcount = 1;
// 比較対象以降の要素と比較
for (int l = i + 1; l < NUMBER; l++)
{
// すでに比較を行った場合はスキップ
if (seen[l] == 1)
continue;
// 比較し一致した場合状態を保存、結果を出力し登場回数を加算
if (num[i] == num[l])
{
printf(",%d", l);
seen[l] = 1;
lcount++;
}
// 比較回数を加算
count++;
}
printf("\n");
// 場合2におけるエラー処理
if (lcount == 1)
{
printf("エラー:%dは1度しか登場しません\n", num[i]);
return 1;
}
// 場合3におけるエラー処理
if (lcount > 2)
{
printf("エラー:%dは3度以上登場します\n", num[i]);
return 1;
}
// 状態を保存
seen[i] = 1;
}
printf("要素間の比較回数:%d\n", count);
return 0;
}