gpt4 book ai didi

C - 计算数组中相同数字的出现次数

转载 作者:行者123 更新时间:2023-11-30 16:27:51 25 4
gpt4 key购买 nike

我在 C 中有一个数组,其中:

int buf[4];
buf[0] = 1;
buf[1] = 2;
buf[2] = 5;
buf[3] = 2;

我想用计数器来计算数组中有多少个具有相同值的元素。
在上面的示例中,由于数组中有两个 2,因此具有相似值的元素数量为 2

我尝试过:

#include <stdio.h>

int main() {
int buf[4];
int i = 0;
int count = 0;
buf[0] = 1;
buf[1] = 2;
buf[2] = 5;
buf[3] = 2;
int length = sizeof(buf) / sizeof(int);

for (i=0; i < length; i++) {
if (buf[i] == buf[i+1]) {
count++;
}
}
printf("count = %d", count);
return 0;
}

但我得到 0 作为输出。希望得到一些帮助。

<小时/>

更新

很抱歉没有说清楚。

第一:该数组的大小仅限于 4,因为它涉及 4 方向,即左、下、上、右。

第二:如果数组中至少有 2 个元素具有相同的值,则接受 count。任何不足的东西都不会注册。

示例:

1,2,5,2 
count = 2 since there are two '2's in the array.

1,2,2,2
count = 3 since there are three '2's in the array

1,2,3,4
count = 0 since there are no similarities in the array. Hence this is not accepted.

任何小于 count = 2 的内容都是无效的。

最佳答案

您确实对 buf 中值出现的顺序感到困惑。当限制为 4 个值时,处理此问题的唯一基本方法是使用嵌套循环进行传递以确定匹配值是什么,然后再次对 buf 进行一次传递,计算它的次数发生(并且由于您限制为 4 个值,即使有一对匹配项,您的 count 也被限制为 2 ——因此,您选择的值并不重要数)

一个简短的例子是:

#include <stdio.h>

int main (void) {

int buf[] = {1, 2, 5, 2},
length = sizeof(buf) / sizeof(int),
count = 0,
same = 0;

for (int i = 0; i < length - 1; i++) /* identify what value matches */
for (int j = i + 1; i < length; i++)
if (buf[i] == buf[j]) {
same = buf[i];
goto saved; /* jump out of both loops when same found */
}
saved:; /* the lowly, but very useful 'goto' saves the day - again */

for (int i = 0; i < length; i++) /* count matching numbers */
if (buf[i] == same)
count++;

printf ("count = %d\n", count);

return 0;
}

示例使用/输出

$ ./bin/arr_freq_count
count = 2

虽然对这些值进行了多次传递,但使用实际的频率数组来完全确定每个值出现的频率只需要花费很少的时间,例如

#include <stdio.h>
#include <string.h>
#include <limits.h>

int main (void) {

int buf[] = {1, 2, 3, 4, 5, 2, 5, 6},
n = sizeof buf / sizeof *buf,
max = INT_MIN,
min = INT_MAX;

for (int i = 0; i < n; i++) { /* find max/min for range */
if (buf[i] > max)
max = buf[i];
if (buf[i] < min)
min = buf[i];
}

int range = max - min + 1; /* max-min elements (inclusive) */
int freq[range]; /* declare VLA */

memset (freq, 0, range * sizeof *freq); /* initialize VLA zero */

for (int i = 0; i < n; i++) /* loop over buf setting count in freq */
freq[buf[i]-min]++;

for (int i = 0; i < range; i++) /* output frequence of values */
printf ("%d occurs %d times\n", i + min, freq[i]);

return 0;
}

(注意:对范围添加健全性检查,以防止在 min 实际上接近 INT_MIN 时对所需的存储量感到惊讶> 并且您的 max 接近 INT_MAX - 事情可能会快速停止,具体取决于可用内存量)

示例使用/输出

$ ./bin/freq_arr
1 occurs 1 times
2 occurs 2 times
3 occurs 1 times
4 occurs 1 times
5 occurs 2 times
6 occurs 1 times

在您编辑并解释仅限于 4 个值之后,编译器应该可以很好地优化第一个基本方法。但是,对于超过 4 个值或需要任何内容​​的频率(文件中的字符、数组中的重复项等)时,请考虑频率数组。

关于C - 计算数组中相同数字的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52619100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com