2017-01-10 61 views
4

我試圖從兩個數組中輸出不同的元素。所以如果我有一個數組A:{9, 0, 1}和B是{0, 8, 1},我需要輸出一個包含在第一組中的元素,但不包括在第二個中:9不能想到我應該如何比較第一個數組中的所有元素與第二個。輸出兩個數組中的不同元素

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

int main() 
{ 
    int a[10],b[10],c,n,i,j; 

    printf("enter a number: "); 
    scanf("%d",&n); 
    for(i=0;i<n;i++){ 
    printf("Enter a[%d]: ",i+1); 
    scanf("%d",&a[i]); 
    } 
    printf("\n"); 
    for(j=0;j<n;j++){ 
    printf("Enter b[%d]: ",j+1); 
    scanf("%d",&b[j]); 
    } 

    for (i = 0; i < n; i++) { 
      printf("%d ", a[i]); } 

      printf("\n"); 

    for (i = 0; i < n; i++) { 
      printf("%d ", b[i]); } 
      printf("\n"); 

return 0; 
} 

我想表明我的想法,但我認爲這是愚蠢的:

for(i=0;i<n;i++){ 
     for(j=0;j<n;j++){ 
      if(a[i]!= b[j]){ 
       c=a[i]; 
      } 
     } 
    printf("%d ",c); 
    } 
+0

你的意思輸出在共同*所有元素*兩個陣列之間?在你的描述中,你會說「不同的元素」,但在你的例子中,你輸出的是數組中相同的元素。 –

+0

@GovindParmar SORRY !!!!!我編輯了 –

+0

你有沒有其他的數組約束?所有整數都可以顯示爲值? – StoryTeller

回答

2

如果你想有一個更有效的解決方案,通過@Sumeet辛格的建議,你可以在第二陣列qsort進行排序,然後找到第一陣列相似的元素與bsearch(二進制搜索)。

您當前的解決方案是O(N^2)時間,這將非常緩慢,但是您可以通過此方法實現更高的效率。

下面是一些代碼,我寫了說明了這一點:

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

#define NNUMBERS 10 

void get_array_input(int array1[], int array2[], size_t *n); 
void search_elements(int array1[], int array2[], size_t n); 
void print_arrays(int array[], size_t n); 
int cmp_func(const void *a, const void *b); 

int main(void) { 
    int array1[NNUMBERS], array2[NNUMBERS]; 
    size_t n; 

    /* input from user */ 
    get_array_input(array1, array2, &n); 

    printf("\nFirst array: "); 
    print_arrays(array1, n); 

    printf("\nSecond array: "); 
    print_arrays(array2, n); 

    /* sorting the second array */ 
    qsort(array2, n, sizeof(*array2), cmp_func); 

    printf("\nSorted Second array: "); 
    print_arrays(array2, n); 

    /* the search begins */ 
    search_elements(array1, array2, n); 

    return 0; 
} 

void get_array_input(int array1[], int array2[], size_t *n) { 
    size_t i; 

    printf("Enter n: "); 
    if (scanf("%zu", n) != 1) { 
     printf("Invalid n value.\n"); 
     exit(EXIT_FAILURE); 
    } 

    for (i = 0; i < *n; i++) { 
     printf("Enter array1[%zu]: ", i); 
     if (scanf("%d", &array1[i]) != 1) { 
      printf("Invalud array value.\n"); 
      exit(EXIT_FAILURE); 
     } 
    } 

    for (i = 0; i < *n; i++) { 
     printf("Enter array2[%zu]: ", i); 
     if (scanf("%d", &array2[i]) != 1) { 
      printf("Invalud array value.\n"); 
      exit(EXIT_FAILURE); 
     } 
    } 
} 

void search_elements(int array1[], int array2[], size_t n) { 
    size_t i; 
    void *key; 

    printf("\nElements in first array which are not in second array: "); 
    for (i = 0; i < n; i++) { 
     key = bsearch(&array1[i], array2, n, sizeof(*array2), cmp_func); 
     if (!key) { 
      printf("%d ", array1[i]); /* not found, so print it */ 
     } 
    } 
    printf("\n"); 
} 

void print_arrays(int array[], size_t n) { 
    size_t i; 

    for (i = 0; i < n; i++) { 
     printf("%d ", array[i]); 
    } 
    printf("\n"); 
} 

/* cmp function needed for qsort and bsearch */ 
/* many ways to write these */ 
int cmp_func(const void *a, const void *b) { 
    const int *num1 = (const int *)a; 
    const int *num2 = (const int *)b; 

    if (*num1 > *num2) { 
     return +1; 
    } else if (*num1 < *num2) { 
     return -1; 
    } 
    return 0; 
} 

輸入:

Enter n: 3 
Enter array1[0]: 9 
Enter array1[1]: 0 
Enter array1[2]: 1 
Enter array2[0]: 0 
Enter array2[1]: 8 
Enter array2[2]: 1 

輸出:

First array: 9 0 1 

Second array: 0 8 1 

Sorted Second array: 0 1 8 

Elements in first array which are not in second array: 9 
1

你在正確的道路上。您正在從第一個數組中獲取每個值,並與第二個數值中的每個值進行比較。

你現在需要做的是隻打印a[i]如果沒有任何b[j]這樣他們是相同的。最簡單的方法是設置一個標誌(例如,unique=1)。你可以給這個標誌任何你認爲合適的名字,但在這種情況下,我認爲它說數字a[i]對於數組a是「唯一的」。所以在這種情況下,你的前提是,你不會在數組b中找到a[i],然後嘗試反駁你的假設。如果在您搜索的任何時候發現a[i] == b[j]的實例,那麼您的前提是錯誤的,因此您設置了unique=0

a[i]b中的所有元素進行比較後,您會查看該標誌。並根據您是否在b中找到該元素來打印相應的消息。

請注意,這假設相同的值不會在a中出現兩次。

0

我編輯了自己的代碼一點點,這個代碼給你所需的輸出:

#include <stdio.h> 

int main(void){ 
     int a[10],b[10],c,n,i,j; 
     int counter=0; 
     printf("enter a number: "); 
     scanf("%d",&n); 
     for(i=0;i<n;i++){ 
       printf("Enter a[%d]: \n",i+1); 
       scanf("%d",&a[i]); 
     } 
     printf("\n"); 
     for(j=0;j<n;j++){ 
       printf("Enter b[%d]: \n",j+1); 
       scanf("%d",&b[j]); 
     } 
     for(i=0;i<n;i++){ 
       counter=0; 
       for(j=0;j<n;j++){ 
         if(a[i]!=b[j]){ 
           counter++; 
         } 
       } 
       if(counter == n){ 
         printf("%d ",a[i]); 
       } 
     } 
     return 0; 
} 

讓我們來解釋一下這個代碼一點點: 在過去的嵌套的循環,外循環需要從數組一個元素一個。內循環獲取數組b的每個元素,以便將其與數組a中的元素進行比較。如果數組b的元素都不等於a的元素,則計數器將等於n(數組大小)。然後,我們可以打印從拍攝這個元素(這意味着有這個考慮元素和陣列之間不匹配B的所有元素。

+1

感謝您的幫助,我想我離你很近,但我無法想到它。再次感謝你! –

4

這可以通過使用二進制搜索迎刃而解。按照簡單的步驟。

步驟1:排序所述第二陣列

步驟2:對於第一陣列的每個元素,所述第二陣列中的二進制搜索它,如果它的不存在,打印它,否則不

時間複雜度爲O(m log n),其中m是第一個數組的長度,n是第二個數組的長度。

+0

'O((m + n)* log(n))'包括排序時間 – anatolyg

+0

好的答案,我在一個答案中寫了一些代碼來測試。絕對是一個非常有效的方法。 – RoadRunner

+0

如果你要排序,那麼最好是對兩者進行排序。例如,按降序排序。如果'a [i] a [i]'使得'a [k] == b [j]',所以你可以排除在'a'中有'b [j]'的可能性。如果'a [i]> b [j]',那麼你可以排除在'b'中有'a [i]'的可能性。 Big-O是一樣的,但是現在你依次遍歷兩個數組。 – giusti

相關問題