程序应该允许用户输入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;
}
目前平均值只是重复第二个数字。我在这里有多远?
你不需要 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;
我已经编辑了我的答案并取消删除了它,以解释为什么它很糟糕以及为什么塞尔比的答案是正确的。
正如塞尔比指出的那样,[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
out 替换它们.
由此产生的简化顺序是
) * 0.5 )/( m + k - m + 1) ( ( m2+ km + km + k2+ m + k - m2 + m ) * 0.5 )/( k + 1 ) ( ( 2公里 + 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
这正是value1
和value2
的平均值