计算输入数字的最小值、最大值和平均值

Posted

技术标签:

【中文标题】计算输入数字的最小值、最大值和平均值【英文标题】:Calculating minimum, maximum, and average of inputted numbers 【发布时间】:2012-04-27 20:43:49 【问题描述】:

有没有办法在不使用数组的情况下计算所有数字的平均值/最小值/最大值?每秒需要计算多达 10,000 个数字。

【问题讨论】:

如果合适,请添加作业标签。 我看到许多解决方案提到保留所有数字的总和。这可能会导致溢出吗? @ColinD:为了得到一个系列的平均值,你必须在某个时候把它加起来。 @ColinD:这取决于规范。使用 64 位计数器添加 32 位整数是非常安全的;) @ColinD:你会很快失去精度。整数除法会去掉小数部分(你认为将它乘回去会发生什么?),浮点除法会受到舍入误差的影响。此外,这不会使您免于溢出。将 65536 乘以 65536,它将不再适合 int32。 【参考方案1】:

是的,

保留一个初始化为较高值的最小变量,如果看到较低值则更新它。

用最大变量做相反的事情。

将所有数字相加,然后将该总和除以总数得到平均值。

以下代码不进行边界检查(例如计数 > 0,总数不会溢出),但应该给您一个想法:

int minimum = // Initialize to large #, in C# would be int.MaxValue
int maximum = // Initialize to most negative #, in C# would be int.MinValue
int count = 0;
int total = 0;

void StatsForNewNumber(int number)

    if (number < minimum) minimum = number;
    if (number > maximum) maximum = number;
    count++;
    total += number;


int Average()

    return total / count;

【讨论】:

总数溢出怎么办? 使用数组进行数学运算也会遇到同样的问题。如果对于给定的用例,远程可能的话,检查溢出。如果需要,使用一个长的,甚至可以管理任意大整数的库。如果双打的固有问题是可以接受的,那么总计也可以在双打中完成。 long long 现在是标准的,几乎每个编译器都有它。使用它。 @EricJ.,如果您使用整数初始化双精度数,则大多数情况下可以避免双精度数的问题。这就像拥有一个可以优雅地处理溢出的 53 位整数类型。【参考方案2】:

当然。保留您收到的最小和最大数字,以及数字的总和和计数。当您需要最小或最大的时,请将其退回。当您需要平均值时,将总和除以数字。

Boost Accumulators 包括以上所有的实现,以及其他一些实现。

【讨论】:

总数溢出怎么办? @ColinD:就像您使用数组一样,这意味着它取决于。您可能会忽略它,或者使用更大的类型。还有其他方法,但没有特别的理由相信它们特别有可能在这里应用。我相信链接的 Accumulators 库有处理/防止溢出的代码(但不记得了)。【参考方案3】:

绝对:一次可以计算一个项目。

保持当前最小值和当前最大值,计算运行总数和计数。当您需要平均值时,将运行总数除以计数,您就会得到答案。

class calc 
    double minVal, maxVal, total;
    int count;
public:
    calc()
    :   minVal(numeric_limits<double>::max)
    ,   maxVal(numeric_limits<double>::min)
    ,   total(0)
    ,   count(0) 
    
    void process(double num) 
        minVal = min(minVal, num);
        maxVal = max(maxVal, num);
        total += num;
        count++;
    
    double getAvg() 
        // TODO: Check count to be > 0 here
        return total / count;
    
    double getMin() 
        return minVal;
    
    double getMax() 
        return maxVal;
    

【讨论】:

总数溢出怎么办? @ColinD 考虑到 OP 要求一种解决方案来替换基于数组的解决方案,看起来总溢出不是一个问题。【参考方案4】:

创建四个变量:一个用于存储 minVal,一个用于 maxVal,一个用于总和,一个用于在每次新输入后递增。将每个新输入与 minVal 和 maxVal 进行比较,并根据需要进行更新。将输入值添加到总和,递增计数器。平均值始终是总和/计数器,因此您可以在需要时即时查询此值,或者在完成后在最后计算它。

【讨论】:

他正在处理大量的价值观。当总数溢出时会发生什么? @ColinD:只需使用 int64_t(或 long long)来存储总数,并以整数读取输入,呵呵。【参考方案5】:

您实际上不需要在数组中存储任何数字来查找平均值/最小值/最大值,因为您正在迭代您所做的数字

if(currentSmallest > currentNumber)
     currentSmallest = currentNumber

if(currentLargest < currentNumber)
     currentLargest = currentNumber

此外,您将保留一个计数器和总和,然后通过将这些数字相除,您将得到平均值。无需将它们存储在数组中。

【讨论】:

总数溢出怎么办?

以上是关于计算输入数字的最小值、最大值和平均值的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中找到输入数字的平均值、最小值、最大值和范围?

在不知道输入数量的情况下计算最小、最大和平均输入值的最佳方法? [关闭]

Java编程、输入数字个数、平均数、最小值、最大值减去最小值、

求一段JS的函数代码....

显示用户输入的最小值和最大值并找到平均值

c语言:输入两个整数,计算并输出这两个整数的和·平均数·最大值·最小值?