如何查找特定元素在数组中重复了多少次?
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 值分配给名为 countings
的 int
。如果你要 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
函数中,您试图访问索引为 10
的 bucket
的元素;唯一有效的索引是 0, 1, ..., 9
.
之一
在entropy_calculator
中,假设我们把所有的10都改成9,这样循环就从x = 0
、x = 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
的出现次数,2
s, ..., 10
s 在数组中。
为了让程序稍微通用一些,我们定义了宏MAX_LEN
并让它代表数字10。
在main
中,首先,我们通过将种子设置为当前时间来初始化随机数生成器。其次,我们定义一个 MAX_LEN
int
的数组,称为 bucket
。第三,我们用[1, MAX_LEN]
中的pseudo-random整数填充bucket
的每个元素。最后,我们调用函数 entropy_calculator
,传递 bucket
作为唯一参数,然后是 return 0
.
在函数 entropy_calculator
中,我们定义了一个名为 counts
的 MAX_LEN
int
数组,每个元素都初始化为零。我们创建自己的内部映射,这样counts
的第n
个元素代表在bucket
中找到的n
个数,对于 {1, 2, ..., MAX_LEN}
中的每个 n
。等价地,对于 {1, 2, ..., MAX_LEN}
中的每个 n
,在桶中找到的 n
的数量由索引为 n - 1
的 counts
的元素表示。然后我们遍历 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);
}
我生成了一个包含 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 值分配给名为countings
的int
。如果你要 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
函数中,您试图访问索引为10
的bucket
的元素;唯一有效的索引是0, 1, ..., 9
.在
entropy_calculator
中,假设我们把所有的10都改成9,这样循环就从x = 0
、x = 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
的出现次数,2
s, ...,10
s 在数组中。
为了让程序稍微通用一些,我们定义了宏MAX_LEN
并让它代表数字10。
在main
中,首先,我们通过将种子设置为当前时间来初始化随机数生成器。其次,我们定义一个 MAX_LEN
int
的数组,称为 bucket
。第三,我们用[1, MAX_LEN]
中的pseudo-random整数填充bucket
的每个元素。最后,我们调用函数 entropy_calculator
,传递 bucket
作为唯一参数,然后是 return 0
.
在函数 entropy_calculator
中,我们定义了一个名为 counts
的 MAX_LEN
int
数组,每个元素都初始化为零。我们创建自己的内部映射,这样counts
的第n
个元素代表在bucket
中找到的n
个数,对于 {1, 2, ..., MAX_LEN}
中的每个 n
。等价地,对于 {1, 2, ..., MAX_LEN}
中的每个 n
,在桶中找到的 n
的数量由索引为 n - 1
的 counts
的元素表示。然后我们遍历 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);
}