C语言 计算一个数字在数组中出现的次数
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25143224/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Count the number of times a number appears in an array
提问by Vandervidi
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 code is:
我的代码是:
#include <stdio.h>
int count_occur(int a[], int num_elements, int value);
void print_array(int a[], int num_elements);
void 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};
int num_occ, i;
printf("\nArray:\n");
print_array(a, 20);
for (i = 0; i<20; i++)
{
num_occ = count_occur(a, 20, a[i]);
printf("The value %d was found %d times.\n", a[i], num_occ);
}
}
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 */
}
}
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");
}
My output is :
我的输出是:
Array:
2 5 0 5 5 66 3 78 -4 -56 2 66 -4 -4 2 0 66 17 17 -4
The value 2 was found 3 times.
The value 5 was found 3 times.
The value 0 was found 2 times.
The value 5 was found 3 times.
The value 5 was found 3 times.
The value 66 was found 3 times.
The value 3 was found 1 times.
The value 78 was found 1 times.
The value -4 was found 4 times.
The value -56 was found 1 times.
The value 2 was found 3 times.
The value 66 was found 3 times.
The value -4 was found 4 times.
The value -4 was found 4 times.
The value 2 was found 3 times.
The value 0 was found 2 times.
The value 66 was found 3 times.
The value 17 was found 2 times.
The value 17 was found 2 times.
The value -4 was found 4 times.
How can I avoid double lines in the output?
如何避免输出中出现双行?
采纳答案by David Ranieri
You can use a parallel array, this example uses char[20]in order to save some space:
您可以使用并行数组,此示例使用char[20]以节省一些空间:
#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 iin count_ocurr:
此方法更快,因为它跳过已读取的值并从iin开始迭代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");
}
回答by BLUEPIXY
#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;
}
回答by amo
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 ifrom mainto count_occur, you can do something such as returning -1 if that value is greater than the iin count_occur. Then if you get that -1 in main, don't print.
在里面count_occur,你有 i 中每个匹配项的索引。如果传入ifrom mainto count_occur,则可以执行某些操作,例如,如果该值大于iin ,则返回 -1 count_occur。然后,如果您在 中得到 -1 main,请不要打印。
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.)
此外,您的算法可以做得更快。您可以对数组的副本进行排序,以便高效地完成搜索,而不是每次都线性地搜索数组。(即使您使用一个数组索引而另一个数组搜索,它也会更快 - 并且仍然以相同的顺序返回值。)
回答by Mohammed Raqeeb
#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);
}
}
回答by Mohit Singh
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;
}
回答by user2110239
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:
在 main() 中,您可以编辑 for 循环:
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);
}
}

