查找用户给定范围内所有数字的平均值

时间:2021-03-27 00:29:14

标签: c++

程序应该允许用户输入 2 个整数并找到用户给出的两个整数之间(包括)所有整数的平均值。

#include <iostream>
using namespace std;

int main()
{
    int value1, value2;
    int total = 0;
    int number = 1;       // the amount of numbers
    float mean;

    cout << "Please enter two positive integers separated by a space" << endl;
    cin >> value1; cin >> value2;

    if (value1 > 0 && value2 > 0)
    {
        for (int total = value1; total <= value2; total++)
        {
            mean = static_cast<float>(total) / number;
        }
        cout << "The mean average of the numbers between and including "
             << value1 << " and " << value2
             << " is " << mean << endl;
    }
    else
    {
        cout << "Invalid input - integer must be positive" << endl;
    }

    return 0;
}

目前的意思是重复第二个数字。我离这里有多远?

2 个答案:

答案 0 :(得分:1)

你不需要 for 循环。您可以将均值计算为:

mean = (value1 + value2)/2.0;

完成。

否则,您程序中的错误如下:

第一个 number 只被赋值为 1。

其次,您将 total 重新声明为 for 循环变量和外部变量。您只需要声明一次。编译器应该已经警告过你了。

第三:

    for (int total = value1; total <= value2; total++)
    {
        mean = static_cast<float>(total) / number;
    }

在上面的内容中,您在每次迭代中不断地为 mean 重新分配一个新值,而不是让它累积。此外 mean 永远不会在 for 循环之前初始化。可能想将其设置为零。

最后,您没有处理用户为 value1 输入的数字大于 value2 的情况。

我想你的意思是这样的:

    if (value1 > value2)
    {
        int tmp = value2;
        value2 = value;
        value1 = tmp;
    }
    number = value2-value1+1;
    mean = 0.0f;

    for (total = value1; total <= value2; total++)
    {
        mean += static_cast<float>(total) / number;
    }

但同样,除非我的数学不好,否则上面的内容被简化为:

 mean = (value1+value2)/2.0;

答案 1 :(得分:-1)

我编辑了我的答案并取消删除它以解释为什么它很糟糕以及为什么selbie的答案是正确的。

正如 selbie 指出的那样,[m, n] 中所有整数的平均值是 (m + n)/2

要弄明白为什么,让我们逐步了解我以前不必要的复杂答案。


<块引用>

(0, n] 中所有整数的总和为 n*(n + 1)/2
假设n > m,要知道(m, n]中所有整数的总和只需减去(0, m]中所有整数的总和,即:(n*(n + 1)/2 - m*(m + 1)/2)
要知道 [m, n] 中所有整数的总和,我们必须使用 m1 = m - 1

一旦你知道总和,平均值就是 sum/(n - m1)


它有效,但它很糟糕,因为正确的答案更容易。
好消息是,从我低效的答案中可以得出好的答案。

我们考虑一下
n = m + k
m1 = m - 1

并将它们替换为等式 (n*(n + 1)/2 - m1*(m1 + 1)/2)/(n - m1)

我对 / 2 进行了分解,并用 * 0.5 替换了它们。
简化的结果序列是

( ( (m + k)*(m + k + 1) - (m - 1)*(m - 1 + 1) ) * 0.5 ) / ( m + k - m + 1)

( ( m2 + km + km + k2 + m + k - m2 + m ) * 0.5 ) / ( k + 1 )

( ( 2km + 2m + k2 + k ) * 0.5 ) / ( k + 1 )

( ( 2m(k + 1) + k(k + 1) ) * 0.5 ) / ( k + 1 )

( (2m + k) * (k + 1) * 0.5 ) / ( k + 1 )

( 2m + k ) * 0.5

( m + k + m ) / 2

( m + n ) / 2

这正是 value1value2 的平均值