2

私はCに非常に慣れていないので、いくつかの指針を期待しています。配列の7つの整数の入力を取得し、それらを検索して、数値が1回だけ表示されるかどうかを確認しようとしています。これが私がこれまでに持っているものです:

#define size 7
int main(void)
{
int array[size], target, i, prev, count;
//Initialize the array
printf("Please enter %d integers", size);
scanf("%d", &target);
prev = array[0];
count = 1;

for(i = 0; i<size; i++)
{
scanf("%d", &array[i]);
...

それはかなりひどいことだと思いますが、Cは私には完全に奇妙です。ユーザーから7つの整数を入力する方法を理解しましたが、どこからインデックスを作成するかについての最初の手がかりはありません。私はまた、それを理解するためのより高度な方法があることに気づきました。しかし、私はアマチュアが理解できる基本的な概念を使用して解決策を見つけようとしています。

4

4 に答える 4

3

重複を検索する最も簡単な方法(最も効率的な方法ではありませんが)は、配列を並べ替えることです。組み込みqsort関数は次のように使用できます。

int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

/* ... */

qsort (array, size, sizeof(int), compare);

int seen = 0;
for (int i = 1; i < size; ++i) {
  if (array[i] == array[i - 1]) {
    if (!seen) {
      printf("%d\n", array[i]);
      seen = 1;
    }
  } else {
    seen = 0;
  }
}
于 2012-09-14T06:07:16.397 に答える
1

私は重複を見つけるための3つの方法を知っています、2つはすでに答えられているので、ここに3番目の(簡略化された)-

複雑さO(N)時間、O(M)メモリ。

数値が要素の数のような範囲内にあり0 - M、要素の数にM匹敵する場合はN、サイズの配列を使用してM+1、数値が以前に表示されたかどうかを確認できます。

コード-

int exists[M+1]; //set M to appropriate value
memset(exists, 0, sizeof(exists)); //set all 0 
for (i = 0; i < N; i++)
{
  if (exists[array[i]])
  {
    printf("Duplicate found\n");
    break; //or something else
  }
  exists[array[i]] = 1;
}

注-入力要素は正の整数である必要があり、以下であることを忘れないでくださいM

于 2012-09-14T06:37:42.027 に答える
1

これは読むのに首が少し痛いので、ここで少し説明します。

まず、標準のi / oライブラリを含め、#define配列サイズを任意に設定し、配列を宣言します(私は私のものと呼びました:intentries [SIZE];)。

「Enter10numbers」の後の最初のforループはメインのループで、10個の数値を配列にプッシュできます。

次のifステートメントは、入力された直後に入力された値に適用されるテストです。

1)最初のifステートメントは、適切な範囲内の値を入力することを確認します。

2)次の「elseif」は、entries [i] = items [0](これが配列の最初のオブジェクトであるかどうかを意味します)の場合、比較するものがないため、何もしないことを示しています。

3)最後の「else」にはネストされたループが含まれています。外側のループは1に初期化されるため、内側のループで行われる比較では、常に現在の値を前の値と比較していることを確認します。

これがお役に立てば幸いです...乾杯:)

* /

#include <stdio.h>

#define SIZE 10

//declarations
int entries[SIZE];

int main(void)
{
    printf("Enter 10 numbers:\n");

    for(int i = 0; i <= SIZE-1; i++)
    {
        printf("[%d]:\n", i);
        scanf("%d", &entries[i]);

        if(entries[i] < 10 || entries[i] > 100) {
            printf("Please enter valid number (between 10 and 100)\n");
            scanf("%d", &entries[i]);
        }
        else if(i == 0) {
            ;
        } else
        {
            for(int j = 1; j <= i; j++)
            {
                *//internal loop goes through all the previous entries (entries[i-1], entries[i-2], etc)*
                for(int k = 0; k < j; k++) {
                    if(entries[j] == entries[k])
                        printf("%d is a duplicate value\n", entries[i]);
                }
            }
        }
    }


}
于 2015-03-21T09:21:28.170 に答える
0

これは、O(n ^ 2)アルゴリズムで実行できます。

int yes = 1, i, j;
for (i = 0; i < n; ++i)
{
   for (j = i + 1; j < n; ++j) if (arr[i] == arr[j])
   {
       printf("Found a duplicate of %d\n", arr[i]);
       yes = 0;
       break;
   }
   if (!yes) break;
}
if (yes) printf("No duplicates");
于 2012-09-14T06:00:38.890 に答える