Count the number of times a number appears in an array

前端 未结 6 1309
我在风中等你
我在风中等你 2021-01-20 15:48

I\'m working on a small program that counts the number of times an integer appears in an array. I managed to do this but there is one thing I can\'t overcome.

My cod

相关标签:
6条回答
  • 2021-01-20 16:17
    #include <stdio.h>
    #include <stdbool.h>
    #include <string.h>
    
    int count_occur(int a[], int num_elements, int value, bool selected[]);
    void print_array(int a[], int num_elements);
    
    int main(void){
        int a[] = {2, 5, 0, 5, 5, 66, 3, 78, -4, -56, 2, 66, -4, -4, 2, 0, 66, 17, 17, -4};
        int size = sizeof(a)/sizeof(*a);
        bool ba[size];
        memset(ba, 0, sizeof ba);
        int num_occ, i;
    
        printf("\nArray:\n");
        print_array(a, size);
    
        for (i = 0; i<size; i++){
            if(ba[i] == true) continue;//skip already count
            num_occ = count_occur(a, 20, a[i], ba);
            printf("The value %d was found %d times.\n", a[i], num_occ);
        }
    }
    
    int count_occur(int a[], int num_elements, int value, bool ba[]){
        int i, count = 0;
        for (i = 0; i<num_elements; i++){
            if (a[i] == value){
                ba[i] = true;
                ++count;
            }
        }
        return count;
    }
    
    void print_array(int a[], int num_elements){
        int i;
        for (i = 0; i<num_elements; i++){
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    

    Little improvement

    int count_occur(int a[], int num_elements, int index, bool selected[]);
    
    num_occ = count_occur(a, 20, i, ba);
    
    int count_occur(int a[], int num_elements, int index, bool ba[]){
        int i, count = 0;
        for (i = index; i<num_elements; i++){
            if (a[i] == a[index]){
                ba[i] = true;
                ++count;
            }
        }
        return count;
    }
    
    0 讨论(0)
  • 2021-01-20 16:18

    I would suggest only printing the statement if the current index is also the index of the first occurrence of the number in question.

    Inside count_occur, you have the index of each match in i. If you pass in the i from main to count_occur, you can do something such as returning -1 if that value is greater than the i in count_occur. Then if you get that -1 in main, don't print.

    In addition, your algorithm could be made faster. Instead of searching the array linearly every time, you can sort a copy of the array so that the search can be done efficiently. (Even if you use one array to index and the other to search, it'll be faster - and still return values in the same order.)

    0 讨论(0)
  • 2021-01-20 16:24
    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
      int arr[] = {2, 5, 0, 5, 5, 66, 3, 78, -4, -56, 2, 66, -4, -4, 2, 0, 66, 17, 17, -4};
      int arrSize = sizeof(arr)/sizeof(arr[0]);
      int tracker[20];
      int i,j,k=0,l=0,count,exists=0;
    
      for (i=0;i<arrSize;i++)
        printf("%d\t", arr[i]);
      printf("\n");
    
      memset(tracker, '$', 20);
    
      for (i=0, j=i+1, count=1, l=0; i<arrSize; i++)
      {
        j=i+1;
        count=1;
        l=0;
    
        while (l < arrSize)
        {
          if (arr[i] == tracker[l])
          {
            exists = 1;
            break;
          }
          l++;
        }
    
        if (1 == exists)
        {
          exists = 0;
          continue;
        }
    
        while (j < arrSize)
        {
          if (arr[i] == arr[j])
            count++;
          j++;
        }
        tracker[k] = arr[i];
        k++;
    
        printf("count of element %d is %d\n", arr[i], count);
      }
    
    }
    
    0 讨论(0)
  • 2021-01-20 16:27

    You can use a parallel array, this example uses char[20] in order to save some space:

    #include <stdio.h>
    
    int count_occur(int a[], char exists[], int num_elements, int value);
    void print_array(int a[], int num_elements);
    
    int main(void) /* int main(void), please */
    {
        int a[20] = {2, 5, 0, 5, 5, 66, 3, 78, -4, -56, 2, 66, -4, -4, 2, 0, 66, 17, 17, -4};
        char exists[20] = {0}; /* initialize all elements to 0 */
        int num_occ, i;
    
        printf("\nArray:\n");
        print_array(a, 20);
    
        for (i = 0; i < 20; i++)
        {
            num_occ = count_occur(a, exists, 20, a[i]);
            if (num_occ) {
                exists[i] = 1; /* first time, set to 1 */
                printf("The value %d was found %d times.\n", a[i], num_occ);
            }
        }
    }
    
    int count_occur(int a[], char exists[], int num_elements, int value)
    /* checks array a for number of occurrances of value */
    {
        int i, count = 0;
    
        for (i = 0; i < num_elements; i++)
        {
            if (a[i] == value)
            {
                if (exists[i] != 0) return 0;
                ++count; /* it was found */
            }
        }
        return (count);
    }
    
    void print_array(int a[], int num_elements)
    {
        int i;
        for (i = 0; i<num_elements; i++)
        {
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    

    This method is faster, as it skips values already readed and starts iterating from i in count_ocurr:

    #include <stdio.h>
    
    int count_occur(int a[], char map[], int num_elements, int start);
    void print_array(int a[], int num_elements);
    
    int main(void)
    {
        int a[20] = {2, 5, 0, 5, 5, 66, 3, 78, -4, -56, 2, 66, -4, -4, 2, 0, 66, 17, 17, -4};
        char map[20] = {0};
        int num_occ, i;
    
        printf("\nArray:\n");
        print_array(a, 20);
    
        for (i = 0; i < 20; i++)
        {
            if (map[i] == 0) {
                num_occ = count_occur(a, map, 20, i);
                printf("The value %d was found %d times.\n", a[i], num_occ);
            }
        }
    }
    
    int count_occur(int a[], char map[], int num_elements, int start)
    /* checks array a for number of occurrances of value */
    {
        int i, count = 0, value = a[start];
    
        for (i = start; i < num_elements; i++)
        {
            if (a[i] == value)
            {
                map[i] = 1;
                ++count; /* it was found */
            }
        }
        return (count);
    }
    
    void print_array(int a[], int num_elements)
    {
        int i;
        for (i = 0; i< num_elements; i++)
        {
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    
    0 讨论(0)
  • 2021-01-20 16:27

    In your function :

    int count_occur(int a[], int num_elements, int value)
    /* checks array a for number of occurrances of value */
    {
      int i, count = 0;
      for (i = 0; i<num_elements; i++)
      {
        if (a[i] == value)
        {
            ++count; /* it was found */
            a[i] = INFINITY;              // you can typedef INFINITY with some big number out of your bound
        }
      }  
      return(count);
    }
    

    And in main() you can edit for loop:

    for (i = 0; i<20; i++)
      {
         if(a[i] != INFINITY)
         {
             num_occ = count_occur(a, 20, a[i]);
             printf("The value %d was found %d times.\n", a[i], num_occ);
         }
      }
    
    0 讨论(0)
  • 2021-01-20 16:37
    very simple logic to count how many time a digit apper
    #include<stdio.h>
      int main()
    {
    int a,b,c,k[10];
    int p[10]={0};
    int bb[10]={0};
    scanf("%d\n",&a);
    for(b=0;b<a;b++)
    {
        scanf("%d",&k[b]);
    
    }
    for(b=a-1;b>0;b--)
    {
        for(c=b-1;c>=0;c--)
        {
            if((k[b]==k[c])&&(bb[c]==0))
            {
                p[b]=p[b]+1;
                bb[c]=1;
            }
        }
    }
        for(c=0;c<a;c++)
            {
            if(p[c]!=0)
            {
                printf("%d is coming %d times\n",k[c],p[c]+1);
            }
        }
        return 0;
    }
    
    0 讨论(0)
提交回复
热议问题