配列に関する質問です。
Posted: 2019年5月05日(日) 20:48
N個のランダムに配置された数値の配列から、重複要素を調べるプログラムをc言語で作成したいです。
分かる方返信お願いします。
分かる方返信お願いします。
ソートしたら、要素番号が変わりますが、
すみません。タグの使い方を間違ったままプレビューもせずに
これも申し訳ありません。最初の質問に「C言語で」と明示されていましたね。かずま さんが書きました: ↑5年前使用するプログラミング言語は C ですか、C++ ですか?
#include <stdio.h>
int comp(const void *ap, const void *bp)
{
int a = *(int*)ap, b = *(int*)bp;
return a < b ? -1 : a > b;
}
int main(void)
{
int a[] = { 30, 10, 40, 20, 50, 40, 30, 30 };
const int n = sizeof a / sizeof *a;
int dup = 0; // 重複要素値表示済みフラグ
qsort(a, n, sizeof *a, comp);
for (int i = 1; i < n; i++)
if (a[i] != a[i-1]) dup = 0;
else if (!dup) printf("%d\n", a[i]), dup = 1;
}
すみません。このままでも、コンパイルできて実行もできると思いますが、かずま さんが書きました: ↑5年前お詫びに、重複要素の値だけを表示する Cプログラムをお見せします。
すみません。かずま さんが書きました: ↑5年前例えば、
int a[8] = { 30, 10, 40, 20, 50, 40, 30, 30 };
という配列があった時、
....
・重複要素の値と元の要素番号の両方の場合
30: 0 6 7
40: 2 4
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main()
{
int a[] = { 30, 10, 40, 20, 50, 40, 30, 30 };
const int n = sizeof a / sizeof *a;
map<int, vector<int>> m;
for (int i = 0; i < n; i++) m[a[i]].push_back(i);
for (auto& p : m)
if (p.second.size() > 1) {
cout << p.first << ':';
for (int i : p.second) cout << ' ' << i;
cout << endl;
}
}
#include <stdio.h>
#include <stdlib.h> // malloc, free
int main(void)
{
int a[] = { 30, 10, 40, 20, 50, 40, 30, 30 };
const int n = sizeof a / sizeof *a;
int *c = malloc(sizeof a);
int i, j, k;
for (i = 0; i < n; i++) c[i] = i;
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
if (a[c[i]] > a[c[j]]) k = c[i], c[i] = c[j], c[j] = k;
k = 0; // 重複検出フラグ
for (i = 0; i < n-1; i++)
if (a[c[i]] == a[c[i+1]]) {
if (!k) printf("%d:", a[c[i]]);
printf(" %d", c[i]), k = 1;
}
else if (k) printf(" %d\n", c[i]), k = 0;
if (k) printf(" %d\n", c[i]);
free(c);
}