我正在尝试创建一个具有5个输入参数的函数,并返回3个最大值的平均值。但是,我不应该使用排序算法,矢量/数组或函数库,并且仍然尝试使用它来开发最有效的逻辑。
到目前为止,我已经提出了以下代码。考虑到这些限制,它是否是最有效的?
float avg3of5(float a, float b, float c, float d, float e) {
float min;
float min2;
min = a;
if (b < min) {
min2 = min;
min = b;
}
else {
min2 = b;
}
if (c < min) {
min2 = min;
min = c;
}
else {
if (c < min2) {
min2 = c;
}
}
if (d < min) {
min2 = min;
min = d;
}
else {
if (d < min2) {
min2 = d;
}
}
if (e < min) {
min2 = min;
min = e;
}
else {
if (e < min2) {
min2 = e;
}
}
Return = (a + b + c + d + e - min - min2) / 3
}
答案 0 :(得分:-1)
立即跳出来的一件事是由以下原因造成的重复:
if (b < min) {
min2 = min;
min = b;
}
else {
min2 = b;
}
将此逻辑提取到函数中然后再调用它可能更好:
#include <iostream>
float avg3of5(const float, const float, const float, const float, const float);
void adjustmins(const float, float*, float*);
int main()
{
std::cout << avg3of5(4,6,2,6,3);
}
float avg3of5(const float a, const float b, const float c, const float d, const float e){
float min;
float min2;
min = a;
adjustmins(b, &min, &min2);
adjustmins(c, &min, &min2);
adjustmins(d, &min, &min2);
adjustmins(e, &min, &min2);
return (a + b + c + d + e - min - min2) / 3;
}
void adjustmins(const float n, float* min, float* min2){
if (n < *min) {
*min2 = *min;
*min = n;
}
else {
*min2 = n;
}
}
我无法告诉你,这在处理时间方面是否更有效,但重复次数要少得多。
如果你更喜欢使用引用而不是指针,请使用它(仅限C ++):
void adjustmins(const float, float&, float&);
和
void adjustmins(const float n, float& min, float& min2){
if (n < min) {
min2 = min;
min = n;
}
else {
min2 = n;
}
}
然后致电:
adjustmins(b, min, min2);