2017-01-10 5 views
4

Ich versuche, verschiedene Elemente aus zwei Arrays auszugeben. Also, wenn ich ein Array habe A: {9, 0, 1} und B ist {0, 8, 1}, muss ich ein Element, das im ersten Satz enthalten, aber nicht in der zweiten enthalten sind: 9 Kann nicht denken, wie ich alle Elemente aus dem ersten Array mit vergleichen sollte der zweite.Ausgabe verschiedener Elemente aus zwei Arrays

#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; 
} 

Ich möchte meine Gedanken zeigen, aber ich denke, es ist dumm:

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

Meinen Sie Ausgabe alle Elemente, die gemeinsam * sind * zwischen den beiden Arrays? In Ihrer Beschreibung sagen Sie "verschiedene Elemente", aber in Ihrem Beispiel geben Sie die Elemente aus, die in den Arrays gleich sind. –

+0

@GovindParmar SORRY !!!!! Ich habe bearbeitet –

+0

Haben Sie andere Einschränkungen der Arrays? Alle ganzen Zahlen können als Werte erscheinen? – StoryTeller

Antwort

2

Wenn Sie eine effizientere Lösung wünschen, wie von @Sumeet Singh vorgeschlagen, können Sie das zweite Array mit qsort sortieren, dann finden Sie ähnliche Elemente aus dem ersten Array mit (binäre Suche).

Ihre aktuelle Lösung ist O (N^2) Zeit, die mit großen n sehr langsam sein wird, aber Sie können mehr Effizienz mit diesem Ansatz erreichen. Hier

ist einige Code, den ich mit aufschrieb dies zeigt:

#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; 
} 

Eingang:

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 

Ausgang:

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

Sie auf dem richtigen Weg sind. Sie nehmen jeden Wert vom ersten Array und vergleichen ihn mit jedem Wert im zweiten.

Was Sie jetzt tun müssen, ist nur zu drucken a[i], wenn es keine b[j] so, dass sie die gleichen sind. Der einfachste Weg ist, eine Flagge zu setzen (zB unique=1). Sie können dieser Flagge jeden Namen geben, den Sie für geeignet halten, aber in diesem Fall denke ich, dass die Nummer a[i] für das Array a "einzigartig" ist. In diesem Fall beginnen Sie mit der Prämisse, dass Sie a[i] im Array b nicht finden werden und dann versuchen Sie, Ihre Annahme zu widerlegen. Wenn Sie zu irgendeinem Zeitpunkt der Suche eine Instanz von a[i] == b[j] finden, dann war Ihr Standort falsch, also setzen Sie unique=0.

Nachdem Sie diese a[i] gegen alle Elemente in b verglichen haben, überprüfen Sie Ihre Flagge. Und Sie drucken die entsprechende Nachricht abhängig davon, ob Sie dieses Element in b gefunden haben oder nicht.

Beachten Sie, dass davon ausgegangen wird, dass derselbe Wert nicht zweimal in a erscheint.

0

ich Ihren Code ein wenig bearbeitet haben und dieser Code gibt Ihnen gewünschte Ausgabe:

#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; 
} 

Lassen Sie uns diesen Code ein wenig erklären: In der letzten verschachtelten for-Schleife, nimmt äußere Schleife ein Element aus dem Array ein. Inner loop ruft jedes Element von Array b ab, um es mit dem Element aus Array a zu vergleichen. Wenn keines der Elemente von Array b gleich einem genommenen Element ist, wird der Zähler gleich n (Array-Größe) sein. Dann können wir dieses Element aus einem genommen drucken (es bedeutet, dass es keine Übereinstimmung zwischen diesen genommen Element und Array b alle Elemente ist.

+1

Vielen Dank für Ihre Hilfe, ich denke, ich war in Ihrer Nähe, aber ich konnte nicht daran denken. Danke dir ein weiteres mal! –

4

Diese leicht Binary Suche mit gelöst werden können. Den einfachen Schritten folgen.

Schritt 1: die zweite Anordnung sortieren

Schritt 2. Für jedes Element des ersten Arrays, die binäre Suche in der zweiten Anordnung, wenn es nicht vorhanden ist, drucken, sonst nicht

.

Die Zeitkomplexität ist O (m log n), wobei m die Länge des ersten Arrays und n die Länge des zweiten Arrays ist.

+0

'O ((m + n) * log (n))', um die Zeit für die Sortierung einzubeziehen – anatolyg

+0

Schöne Antwort, ich schrieb einen Code in eine der Antworten, um dies zu testen. Definitiv ein sehr effizienter Ansatz. – RoadRunner

+0

Wenn Sie sortieren möchten, sortieren Sie am besten beide. Zum Beispiel, sortiere beide absteigend. Wenn 'a [i] a [i]' finden, so dass 'a [k] == b [j] ', also du ausschließen kannst die Möglichkeit, 'b [j]' in 'a' zu haben. Wenn 'a [i]> b [j]', dann können Sie die Möglichkeit ausschließen, 'a [i]' in 'b' zu haben. Das Big-O ist dasselbe, aber jetzt durchqueren Sie beide Arrays nacheinander. – giusti

Verwandte Themen