0

配列内の重複を検出し、配列内にすべての重複が何回存在するかを調べるプログラムを作成する必要があります。これは私のコードです:

#include <stdio.h>
#include <stdlib.h>

#define DIM 5

int contains (int v[], int dim, int n);

int main(int argc, char** argv) 
{
    int i, j, k = 0, found;
    int v[DIM];
    int dup[DIM] = {0};

    for (i = 0; i < DIM; i++)
    {
        printf("Insert element in the array: ");
        scanf("%d", &v[i]);
    }

    for (i = 0; i < DIM; i++)
    {
        found = 0;

        if (contains (dup, DIM, v[i]) == 0)
        {
            for (j = 0; j < DIM; j++)
            {
                if (v[i] == v[j] && (i != j))
                {
                    found ++;
                    dup[k] = v[i];
                    k++;
                }
            }
            if (found != 0)
            {
                printf("Element %d has been repeated %d times\n", v[i], found);
            }
        }
    }


    return (0);
}


int contains (int v[], int dim, int n)
{
    int i;
    int found = 0;

    for (i = 0; i < dim; i++)
    {
        if (v[i] == n)
        {
            found = 1;
        }
    }

    return found;
}

プログラムは非常にうまく機能しますが、あまり効率的ではないと思います。確かに、プログラムを効率的にする方法は存在しますね。つまり、他の構造ではなく、配列を使用し続ける方法を意味します

4

4 に答える 4

0

ユーザーが入力した数値の範囲がわかっている場合は、ここに O(n) メソッドがあります。数値が 0 ~ 99 の範囲内になることがわかっているとします。

ここに疑似コードがあります。

//Input the array elements in an array named arr[]

static int freq[101]; //create a static array to initialize all elements to 0

//scan the array arr and increment the counter at index of freq array

for(int i=0;i<(arr.length);i++)
    freq[arr[i]]++;

//Now scan the array named freq and print the frequency of each of the numbers.
for(int i=0;i<101;i++)
    if(freq[i]>0)
         printf("Frequency of %d is:- %d ",i,freq[i]);

これがお役に立てば幸いです。

于 2013-08-08T10:28:17.850 に答える