C 一个数字出现多少次

C 一个数字出现多少次,c,C,请帮帮我。我不明白为什么out在“发生”是“30”,而不是“3”。。这就好像我在用“10”乘以答案,但我不是。。也许我的问题的答案就在我的代码里,但是有人能解释一下原因和方式吗?请事先非常感谢 请看一下我的代码 #include <stdio.h> int main(){ int arr[10] = {7, 7, 3, 2, 9, 8, 5, 1, 7, 9}; int occur[10] = {NULL}; int max = 0; int mo

请帮帮我。我不明白为什么out在“发生”是“30”,而不是“3”。。这就好像我在用“10”乘以答案,但我不是。。也许我的问题的答案就在我的代码里,但是有人能解释一下原因和方式吗?请事先非常感谢

请看一下我的代码

#include <stdio.h>

int main(){

    int arr[10] = {7, 7, 3, 2, 9, 8, 5, 1, 7, 9};
    int occur[10] = {NULL};
    int max = 0;
    int most;

    for(int i = 0; i < 10; i++)
    {
        for(int j = 0; j < 10; j++)
        {
            occur[arr[j]]++;
            if(occur[arr[j]] > max)
            {
                max = occur[arr[j]];
                most = arr[j];
            }
        }
    }

    printf("Most frequent: %d\ occurs: %d\n", most, max);

    return 0;
}
#包括
int main(){
int-arr[10]={7,7,3,2,9,8,5,1,7,9};
int-occure[10]={NULL};
int max=0;
int most;
对于(int i=0;i<10;i++)
{
对于(int j=0;j<10;j++)
{
发生[arr[j]++;
如果(发生[arr[j]]>max)
{
最大值=发生[arr[j]];
most=arr[j];
}
}
}
printf(“最频繁:%d\发生:%d\n”,最频繁,最大值);
返回0;
}

我在“最频繁”中得到了正确答案。但是“发生”是30,而不是仅仅3,因为7发生了3次。

你将
max
乘以10,因为你做每件事100次(而不是10次),因为你的i循环完全冗余


具体来说,您的问题是将
中的值递增10次(而不是一次)。由于大多数
不使用递增的值,因此没有问题。

我不认为O(n^2)运算算法不是完成任务的理想方法

但是移动一行代码将修复您的代码

您的循环:

  for(int i = 0; i < 10; i++)
    {
        for(int j = 0; j < 10; j++)
        {
            occur[arr[j]]++;
for(int i=0;i<10;i++)
{
对于(int j=0;j<10;j++)
{
发生[arr[j]++;
修正:

for(int i=0;i<10;i++)
{
发生[arr[i]]++;
对于(int j=0;j<10;j++)
{

我将让您了解如何在O(2n)或更少的操作中实现这一点…

它变为30,因为有一个执行10次的外部循环。 我猜您希望获得数组中最频繁的数字以及它发生的次数,这就是为什么您有一个外循环。如果数组中的数字大于9,这将导致数组中的索引越界问题,则此操作将不起作用。您应该将实现改为:

#include <stdio.h>

int main(){

    int arr[10] = {7, 7, 3, 2, 9, 8, 5, 1, 7, 9};
    int max = 0;
    int most;

    for(int i = 0; i < 10; i++)
    {
        int tmp = arr[i], count = 0;
        // if the current number is the current max number then skip
        if(tmp == max)
           continue;
        for(int j = 0; j < 10; j++)
        {
            // increment count if number in index j is equal to tmp number
            count += arr[j] == tmp ? 1 : 0;
        }
        // [this condition will depend on the requirement.]
        // replace max and most if the count of tmp number is greater than your 
        // current max
        if(count > max){
            max = count;
            most = tmp;
        }
    }
    printf("Most frequent: %d\ occurs: %d\n", most, max);

    return 0;
}
#包括
int main(){
int-arr[10]={7,7,3,2,9,8,5,1,7,9};
int max=0;
int most;
对于(int i=0;i<10;i++)
{
int tmp=arr[i],计数=0;
//如果当前编号是当前最大编号,则跳过
如果(tmp==最大值)
持续
对于(int j=0;j<10;j++)
{
//如果索引j中的数字等于tmp数字,则递增计数
计数+=arr[j]==tmp?1:0;
}
//[此条件将取决于要求。]
//如果tmp编号的计数大于您的值,则替换max和most
//最大电流
如果(计数>最大值){
最大值=计数;
most=tmp;
}
}
printf(“最频繁:%d\发生:%d\n”,最频繁,最大值);
返回0;
}
这没有经过测试,因此如果有任何问题,请随时编辑。

更快的O(2n-1)复杂度解决方案

#include <stdio.h>

int main(){

    int arr[10] = {7, 7, 3, 2, 9, 8, 5, 1, 7, 9};
    int occur[10] = {NULL};
    int max = 0;

    for(int i = 0; i < 10; ++i)
       ++occur[arr[i]];

    for (int i = 1; i < 10; ++i)
       if (occur[i] > occur[max])
         max = i;

    printf("Most frequent: %d\ occurs: %d\n", max, occur[max]);

    return 0;
}
#包括
int main(){
int-arr[10]={7,7,3,2,9,8,5,1,7,9};
int-occure[10]={NULL};
int max=0;
对于(int i=0;i<10;++i)
++发生[arr[i];
对于(int i=1;i<10;++i)
如果(发生[i]>发生[max])
max=i;
printf(“最频繁发生的次数:%d\发生次数:%d\n”,最大,发生次数[max]);
返回0;
}
更快,在O(n)…我有一种感觉

int main(){

    int arr[10] = {7, 7, 3, 2, 9, 8, 5, 1, 7, 9};
    int occur[10] = {NULL};
    int max = 0;

    for(int i = 0; i < 10; ++i)
       if (++occur[arr[i]] > occur[max])
          max = arr[i];

    printf("Most frequent: %d\ occurs: %d\n", max, occur[max]);

    return 0;
}
intmain(){
int-arr[10]={7,7,3,2,9,8,5,1,7,9};
int-occure[10]={NULL};
int max=0;
对于(int i=0;i<10;++i)
如果(++发生[arr[i]]>发生[max])
max=arr[i];
printf(“最频繁发生的次数:%d\发生次数:%d\n”,最大,发生次数[max]);
返回0;
}

Outer for loop是多余的!您可以更轻松地使用所有警告和调试信息编译代码(
gcc-Wall-Wextra-g
with…),然后使用调试器(
gdb
)一步一步地运行你的代码,而不是在这里询问。下次,使用你的调试器我很抱歉,先生@BasileStarynkevitch。我只是一个初学者,正在自学编程。我甚至不知道如何使用调试器。但是现在我知道我必须使用它,我会研究它。谢谢你,先生。但是你应该花些时间自己阅读。
gdb
调试器有一个很好的包含教程的部分。你是成年人,需要能够自己学习。为什么你要递增
NULL
NULL
在大多数情况下是
0
(虽然类型不同),但是宏也可以包含不同的数字,或者根本不包含数字。你的代码是否有效(保存导致x10错误的不必要的外部循环)只是一个巧合。请使用
int-occurve[10]={0};
取而代之。比需要的多9倍……但是是的。非常感谢您,先生……这就解释了……所以我真的不需要外循环。tnx。您需要外循环,因为您正在查找最频繁的数字以及它发生的次数。@sugussnk计数可以在一个循环中完成,然后在一秒钟内获得最大值,不嵌套循环..如果有人显示OP算法所在的测试数据,很高兴删除我的答案(一个循环版本)不起作用-坚持所有数字都必须包含0-9的限制。我觉得这是对的,但我只是在头脑中快速地做了,所以我可能是错的……事实上,内部循环没有引用
I
,这暗示它不在正确的位置。
int main(){

    int arr[10] = {7, 7, 3, 2, 9, 8, 5, 1, 7, 9};
    int occur[10] = {NULL};
    int max = 0;

    for(int i = 0; i < 10; ++i)
       if (++occur[arr[i]] > occur[max])
          max = arr[i];

    printf("Most frequent: %d\ occurs: %d\n", max, occur[max]);

    return 0;
}