- ベストアンサー
配列の確認方法について
- 配列の確認方法について質問です。
- 配列の重複や欠損を確認する方法を教えてください。
- フラグを立てて数値の重複を確認する方法についてアドバイスをお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
for (int i = 0; i < X; ++i) exist[i] = 1; を for (int i = 0; i < X; ++i) exist[a[i]] = 1; とするだけなのでは ・・・
その他の回答 (5)
- Tacosan
- ベストアンサー率23% (3656/15482)
exist に入っている値は 0 と 1 しかないので「総和でこける」ことはありえません. あ, 「0 で初期化」は必要だったっけな....
お礼
再度ありがとうございます。 この手順は、配列の値を全く使っていない気がしていたので、 どこかを記入ミスしているものだと思っていたのですが。 確かにこの手順だと総和でこける事はないのですが、 配列の内容を使っていないので、結果が変わらなく思えるのです。 どこか勘違いしているのでしたらすみません。
- chie65536
- ベストアンサー率41% (2512/6032)
ANo.3ですが、運悪く幾つかの条件が重なるとチェックをすり抜ける場合がある事が判明。 例えば「6が2つあって16が無く、かつ、7が2つあって17が無い」と言うパターンの時。確率はかなり低いが、無いとは言えない。
お礼
おっと、今処理内容を理解しようと見ていたとこだったのですが、そうなのですか・・・。 追記ありがとうです。
- chie65536
- ベストアンサー率41% (2512/6032)
// int array[0]~array[n]に、0~nまでの数値が重複せずに入っているか調べる // nはX-1とする // OKならtrue、NGならfalseを返す int check(int n) { int flg = 0,i; for (i = 0;i <= n;i++) { flg ^= i ^ array[i]; } return !flg; } たぶん、std::vector<int>やビットでのフラグ立てより高速。 一番の長所は「コンパイラを選ばない」って事。C++はもちろん、Cでも動く。
- kenmary_08
- ベストアンサー率23% (7/30)
サイズがXのchar 型の配列a[X]を作り、 前領域を0で初期化し、 対象の配列を読んでいき、nが入っていたら、 0<= n <Xであることを確認し、a[n-1]が0でなければ 重複あり、0ならa[n-1]=1とする。 重複なしで、最後まで続けられたらOK でどうでしょうか。
お礼
確かにchar型配列でも問題ないわけですよね。 ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
「サイズ X の配列 a に 0 から X-1 までの数値を 1つずつ入れる」だけなら for (int i = 0; i < X; ++i) a[i] = i; でいいんだけど, それは望んでいないんですよね. X < 64 であればそれで動くはずです. 一般には std::vector<int> を使って std::vector<int> exist(X); for (int i = 0; i < X; ++i) exist[i] = 1; if (std::accumulate(exist.begin(), exist.end(), 0) == X) { // 全部そろっている } else { // 足りないやつがいる } という感じかな?
お礼
回答有難うございます。 まず補足ですが、配列に格納されるデータはユーザが手入力(もしくは入るから読込)するものです。 ですので、入れ間違いが無いかなどを確認するための処理です。 std::accumulateについて知らなかったため、調べてみた結果、 引数の3番目が0だと総和を求める処理になるものみたいですね。 総和だと、3と5で8になる場合や、4と4で8になる場合があるので、 数字が1つずつあるのかわからないと思うのですが、 何か間違っているのでしょうか? よろしくお願いします。
お礼
あ、ほんとだ。 確かにいけそうな感じに見える。 気づかなかったですよ。 ありがとうございます。