如何查找特定元素在数组中重复了多少次?

How to find how many times a specific element is repeated in an array?

我生成了一个包含 10 个整数的数组。我必须找到一个元素重复了多少次,但我总是得到 0 作为输出。在此代码中,countcolor 变量是我的计数值。例如 countcolor1 是我对整数 1 的计数值。这是我目前所拥有的:

#include <stdio.h>
#include <time.h>

int i;

double entropy_calculator(int bucket[10]);

int main() {
    srand(time(NULL));
    int countings;

    int bucket[10];
    for (i = 0; i < 10; ++i) {
        bucket[i] = 1 + rand() % 10;
        printf("%d \n", bucket[i]);
    }
    countings = entropy_calculator(bucket);
    return 0;
}

double entropy_calculator(int bucket[10]) {
    int x;
    int countcolor1 = 0, countcolor2 = 0, countcolor3 = 0,
        countcolor4 = 0, countcolor5 = 0, countcolor6 = 0;

    for (x = 0; x <= 10; ++x) {
        if (bucket[10] == 1)
            countcolor1++;

        if (bucket[10] == 2)
            countcolor2++;

        if (bucket[10] == 3)
            countcolor3++;

        if (bucket[10] == 4)
            countcolor4++;

        if (bucket[10] == 5)
            countcolor5++;

        if (bucket[10] == 6)
            countcolor6++;
    }
    printf("%d,%d,%d,%d,%d,%d",
           countcolor1, countcolor2, countcolor3,
           countcolor4, countcolor5, countcolor6);
}

代码注释

  • entropy_calculator 的 return 类型是 double 但你没有 return 任何东西。如果您不想 return 任何内容,请将 return 类型设置为 void

  • main 中,您试图将 entropy_calculator 的 return 值分配给名为 countingsint。如果你要 return 一些 double 值,countings 应该是 double.

  • 未定义的行为。根据 C 标准,如果数组下标超出范围,程序的行为是未定义的。 bucket 是一个包含 10 个整数的数组。具有 N 个元素的数组的有效索引通常为 0, 1, 2, ..., N - 1;换句话说,第一个元素的索引为 0,第二个元素的索引为 1,...,第 N 个元素的索引为 N - 1.因此,bucket 数组中的有效索引是闭区间 [0, 10 - 1] = [0, 9] 中的任何整数。在您的 entropy_calculator 函数中,您试图访问索引为 10bucket 的元素;唯一有效的索引是 0, 1, ..., 9.

    之一
  • entropy_calculator中,假设我们把所有的10都改成9,这样循环就从x = 0x = 1、……开始。 , x = 9([bucket[10] == j) 形式的检查 [1, 6] 中的某些 j 被替换为 ([bucket[9] == j)。所有这六项检查都只是检查 bucket 的第 10 个元素是否是 1、2、... 或 6 之一。您忽略了 bucket 中的其他 9 个 randomly-generated 数字所以你永远不会让他们参与计数。您还忽略了其他可能的 randomly-generated 值,即 7、8、9 和 10,因为您目前仅将 bucket 的第 10 个元素与 1、2、...和 ​​6 进行比较.

解决方案

我假设你的任务是

  • [1, 10] 中生成 10 个随机整数并将它们存储在 int 的数组中,例如 bucket.
  • 创建一个函数,该函数接受 10 个 int 的数组作为参数(即指向 int 的指针)并打印 1 的出现次数,2s, ..., 10s 在数组中。

为了让程序稍微通用一些,我们定义了宏MAX_LEN并让它代表数字10。

main中,首先,我们通过将种子设置为当前时间来初始化随机数生成器。其次,我们定义一个 MAX_LEN int 的数组,称为 bucket。第三,我们用[1, MAX_LEN]中的pseudo-random整数填充bucket的每个元素。最后,我们调用函数 entropy_calculator,传递 bucket 作为唯一参数,然后是 return 0.

在函数 entropy_calculator 中,我们定义了一个名为 countsMAX_LEN int 数组,每个元素都初始化为零。我们创建自己的内部映射,这样counts的第n个元素代表在bucket中找到的n个数,对于 {1, 2, ..., MAX_LEN} 中的每个 n。等价地,对于 {1, 2, ..., MAX_LEN} 中的每个 n,在桶中找到的 n 的数量由索引为 n - 1counts 的元素表示。然后我们遍历 bucket 数组的元素,并使用我们的映射增加 counts 数组中的相应元素。然后我们打印出 counts.

的所有元素
  • 例如,对于我们程序中数组的有效索引集合中的某些i,即{0, 1, ..., MAX_LEN - 1},如果我们发现bucket[i]5 , 然后我们要增加 counts 的第 5 个元素(因为 counts 的第 n 个元素计算生成的 n 的数量)这是counts[5 - 1] 或者,更一般地说,counts[bucket[i] - 1].

计划

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

#define MAX_LEN 10

void entropy_calculator(int bucket[]);

int main(void) {

    /* initialize random number generator */
    srand((unsigned) time(NULL));

    /* will contain MAX_LEN random ints in [1, MAX_LEN] */
    int bucket[MAX_LEN];

    /* generate pseudo-random ints in [1, MAX_LEN], storing them in bucket */
    for (int i = 0; i < MAX_LEN; i++) {

        bucket[i] = 1 + rand() % MAX_LEN;
        printf("%d\n", bucket[i]);

    }

    entropy_calculator(bucket);

    return 0;

}

/****************************************************************************
 * entropy_calculator: given an array of MAX_LEN integers in [1, MAX_LEN],  *         *
 *                     prints the number of occurrences of each integer in  *
 *                     [1, MAX_LEN] in the supplied array                   *
 ****************************************************************************/

void entropy_calculator(int bucket[]) {

    int counts[MAX_LEN] = {0};    /* initialize counts to all 0s */
    int i;                        /* loop variable */

    for (i = 0; i < MAX_LEN; i++)
        counts[bucket[i] - 1]++;

    /* printing all elements of counts */
    for (i = 0; i < MAX_LEN; i++) {

        if (i % 4 == 0) printf("\n");
        printf(" %2d*: %d", i + 1, counts[i]);

    }
    printf("\n");

}

示例会话

3
9
2
6
10
9
3
8
3
1

  1*: 1  2*: 1  3*: 3  4*: 0
  5*: 0  6*: 1  7*: 0  8*: 1
  9*: 2 10*: 1

简化版


如果任务是简单地在[1, MAX_LEN]中生成MAX_LEN(宏表示值10)个随机整数,并计算生成了多少1s, 2s, ..., (MAX_LEN - 1), MAX_LENs,那么它可以简单地是完成如下。

我们创建一个 MAX_LEN 整数数组,称为 counts。与 counts 关联的有效索引是 0, 1, ..., MAX_LEN - 1。我们形成自己的内部映射,使得 counts 中索引为 n - 1 的元素表示 {1, 2, ..., MAX_LEN}n 的 randomly-generated n 的数量.

当我们在 [1, MAX_LEN] 中生成一个随机整数时,我们将其分配给 cur,并且我们用索引 cur - 1 递增 counts 的元素,因为该元素表示数字 cur.

出现的次数

计划

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

#define MAX_LEN 10

int main(void) {

    srand((unsigned) time(NULL));    /* initialize random number generator */
    int counts[MAX_LEN] = {0};       /* initialize counts to all 0s */
    int i, cur;

    for (i = 0; i < MAX_LEN; i++) {

        cur = 1 + rand() % MAX_LEN;  /* pseudo-random int in [1, MAX_LEN] */
        printf("%d\n", cur);
        counts[cur - 1]++;

    }

    /* printing all elements of counts */
    for (i = 0; i < MAX_LEN; i++) {

        if (i % 4 == 0) printf("\n");
        printf(" %2d*: %d", i + 1, counts[i]);

    }
    printf("\n");

    return 0;

}

示例会话

8
4
6
2
4
1
10
9
2
10

  1*: 1  2*: 2  3*: 0  4*: 2
  5*: 0  6*: 1  7*: 0  8*: 1
  9*: 1 10*: 2
#include<stdio.h>
#include<time.h>
int i;
double entropy_calculator(int bucket[10]);
int main()
{

    srand(time(NULL));
    int countings;
    int bucket[10];
    for(i=0; i<10; ++i)
    {
        bucket[i] = 1 + rand() % 10;
        printf("%d ", bucket[i]);
    }
    printf("\n");
    countings = entropy_calculator(bucket);
    return 0;
}

double entropy_calculator(int bucket[10])
{

    int x;
    int countcolor1=0, countcolor2=0, countcolor3=0, countcolor4=0, countcolor5=0, countcolor6=0;
    for(x=0; x<10; ++x)
    {
        if (bucket[9]==1)

            countcolor1++;

        
        if (bucket[9]==2)

            countcolor2++;


        if (bucket[9]==3)

            countcolor3++;


        if (bucket[9]==4)

            countcolor4++;


        if (bucket[9]==5)

            countcolor5++;


        if (bucket[9]==6)

            countcolor6++;
             

    }
    printf("%d,%d,%d,%d,%d,%d",countcolor1,countcolor2,countcolor3,countcolor4,countcolor5,countcolor6);


}