【问题标题】:Counting how many times an integer is equal to itself, then calculating the percentage计算一个整数等于自身的次数,然后计算百分比
【发布时间】:2012-03-29 04:04:42
【问题描述】:

我有一个数组,并且数组中有整数。我试图计算数组中的整数重复的次数。之后我想打印百分比。这就是我到目前为止所拥有的。

for(i = 2; i < 8; i++){
    mmblk[i] = (num[i] / bsize);   //mmblk[i] =0,0,1,9,0,1
    if(mmblk[i] == mmblk[i]){      
        count ++;
        p = count/num[0];
        percent = (p * 100);
    }
}
printf("Highest possible hit rate = %d/%d = %d %\n", count, num[0], percent);//num[0]=6

对于我得到的输出: 最高命中率 = 0/6 = 0

输出应如下所示: 最高可能命中率 = 3/6 = 50 %

我知道出了点问题,但我不知道是什么问题。任何帮助将不胜感激。

【问题讨论】:

  • 什么是num[i]?为什么要从 2 迭代到 8? mmblk 数组的大小是多少?
  • if(mmblk[i] == mmblk[i]){ oh my oh my oh my
  • @Jeeva num[i] 是另一个数组,其中包含来自文本文件的行中的字符。它从 2 开始到 8,因为这些是我想从文件中使用的唯一行。 mmblk 的大小为 32。
  • @suddnely_me 在这里输入时我认为这是错误的,但我想不出任何其他方法来检查它。
  • 您要检查什么?你需要检查它是否等于某个数字(比如 0),当然它总是会等于自己....

标签: c arrays count integer


【解决方案1】:

所以如果我理解正确,您正在寻找数组中重复值的最大数量。

func( {1,2,3} ) = 0
func( {1,1,3} ) = 2
func( {1,1,1} ) = 3

要获得百分比,只需将此结果除以数组的长度即可。

问题是你的函数太简单了,根本不是解决方案。

我在第一种方法中提出的解决方案是使用另一个名为 counts 的数组。这与源数组的长度相同。它最终是源数组中每个数字出现的次数。

对于源数组中的每个项目,您计算该数字出现的次数,并将该结果存储在计数中。然后你找到 counts 数组的最大值,并且你有 a) 你正在寻找的最大重复值,以及 b) 源数组中相应的最大重复值的索引。

例如 {0,0,1,9,0,1}:

src    counts
  0       3        Max 
  0       3
  1       2
  9       1
  0       3
  1       2

对此的一个优化是,当您计数时,如果您在数组中较早遇到相同的数字,您可以停止,因为您已经计算了该值的重复次数。

有了这个,你的结果是:

src    counts
  0       3        Max 
  0       0        
  1       2
  9       1
  0       0
  1       0

另一个优化是只从数组中的当前索引开始计数。这与其他优化的原因相同。

结果:

src    counts
  0       3        Max 
  0       2
  1       2
  9       1
  0       1
  1       1

【讨论】:

  • 所以如果源数组中的数字发生变化,这仍然有效吗?
  • 是的,为什么不呢?我没有提供任何代码,因为我认为您需要了解您正在尝试做什么,而不仅仅是插入一些代码并希望它有效。这就是我们最终得到像 Windows 这样的软件的方式。
  • 哈哈。我只是在检查。我没有提到数字会更早发生变化。自 2003 年以来,我没有编写过代码。我有一个问题。如果我不知道我要计算的数字是多少,我该如何比较它?
  • 你有两个嵌套循环。外层遍历数组的每个元素。内部循环获取该索引处的值,然后再次遍历整个数组,测试每个元素与当前值是否相等。如果它们相等,则增加该值的计数。然后继续到数组中的下一个元素。
  • 我的意思是来吧,你有你想要测试的所有值,只需遍历它们,看看它们中的每一个有多少。在一张纸上手动完成;算法会来找你的。
【解决方案2】:

如果你只有小整数,你可以使用一个数组来计算整数出现的次数

const int MAX_INT = 1024;
const int FIRST   = 2;
const int LAST    = 7;

unsigned int count[MAX_INT];
int i;

for (i = 0; i < MAX_INT; i++)
    count[i] = 0;

for (i = FIRST; i <= LAST; i++) {
    if (numbers[i] >= MAX_INT) {
        fprintf(stderr, "Too large number");
        exit 1;
    }
    count[numbers[i]] += 1;
}

for (i = 0; i < MAX_INT; i++)
    if (count[i] > 0)
        // print your statistics

如果你有大整数出现,大到你不能让你的数组count足够大,我猜你需要更复杂的东西;首先对您的数字进行排序可能是一种选择。

【讨论】:

    【解决方案3】:

    我会推荐一个链表或其他一些可变长度容器,其中每个数据节点存储一个数字以及它出现的次数。

    在伪代码中:

    VariableLengthContainer v = EMPTY-CONTAINER n = 大小(输入) 对于输入中的每个数字 如果该数字在容器中,则增加其计数 否则,将该数字添加到容器中并将其计数设置为 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2021-04-23
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      相关资源
      最近更新 更多