0

我正在尝试编写一个程序,该程序输入一定的销售额,并根据三个工资率计划进行一些计算。我想提出的其中一件事是找出三个计划中位数的方法。因此,如果 plan1 = 200、plan2 = 250 和 plan3 = 300,我希望计算机知道中位数是 250。如果有人可以帮助我提供算法或预建函数,我将不胜感激。

4

3 回答 3

3
int ra[3] = { plan1, plan2, plan3 };
std::sort(ra, ra+3);
return ra[1];

可能会更有效地完成 - 如果你真的很幸运,编译器可能会为你优化它。

“应该”更高效的代码可能会更长,例如:

if (plan1 < plan2) {
    if (plan2 < plan3) return plan2;
    // plan2 is the biggest
    return max(plan1, plan3);
} else {
    if (plan1 < plan3) return plan1;
    // plan1 is the biggest
    return max(plan2, plan3);
}

另一种可能:

void order(int &first, int &second) {
    if (second < first) std::swap(first, second);
}

order(plan1, plan2);
order(plan2, plan3);
order(plan1, plan2);
return plan2;
于 2013-09-24T22:04:13.110 回答
0
int median(int plan1, int plan2, int plan3) {
  if (plan1 <= plan2 && plan1 >= plan3 || plan1 <= plan3 && plan1 >= plan2) return plan1;
  if (plan2 <= plan1 && plan2 >= plan3 || plan2 <= plan3 && plan2 >= plan1) return plan2;
  return plan3;
}
于 2013-09-24T22:11:09.950 回答
0

这会变得混乱,但它可以帮助你思考算法。

你怎么能订购三个数字?首先比较其中两个,然后比较第三个,直到你知道它的位置。这将需要很多 if 语句,但会向您展示基本算法。(您也可以使用任何种类的排序功能,但由于您只有三个元素,因此值得考虑)

int findMedian(int num1, int num2, int num3) {
    if (num1 < num2) {
        if (num2 < num3) {
            // the order is then num1, num2, num3
            return num2;
        } else {
            // We know num1 is < num2 and num3 is < num2, but don't know 
            // where num1 and num3 go: num1, num3, num2 or num3, num1, num2?
            if (num1 < num3) {
                // now we know: num1, num3, num2
                return num3;
            } else {
                // num3, num1, num2
                return num1;
            }
        }
    } else {
        if (num2 < num3) {
             // We know num2 < num1 and num2 < num3, but don't know where num1
             // and num3 go: num2, num1, num3 or num2, num3, num1?
             if (num1 < num3) {
                 // now we know: num2, num1, num3
                 return num1;
             } else {
                 // num2, num3, num1;
                 return num3;
             }
        } else {
             // We know num2 < num1 and num3 < num2, so num3, num2, num1
             return num2;
        }
    }
}

能够思考算法可以流动的所有路径是一个很好的练习,这证明了这个过程。一旦你有了逻辑,如果你愿意,你可以使用三元运算符使其更简洁(并去掉注释):

int findMedian(int num1, int num2, int num3) {
    if (num1 < num2) {
        if (num2 < num3) {
            return num2;
        } else {
            return (num1 < num3) ? num3 : num1;
        }
    } else {
        if (num2 < num3) {
             return (num1 < num3) ? num1 : num3;
        } else {
             return num2;
        }
    }
}

如果我们想牺牲可读性,我们可以进一步压缩它:

int findMedian(int num1, int num2, int num3) {
    if (num1 < num2) {
        return (num2 < num3) ? num2 : (num1 < num3) ? num3 : num1;
    } else {
        return (num2 < num3) ? (num1 < num3) ? num1 : num3 : num2;
    }
}

或者,我们可以采取最后的丑陋步骤,并以一行结尾:

int findMedian(int num1, int num2, int num3) {
    return (num1 < num2) ?(num2 < num3) ? num2 : (num1 < num3) ? num3 : num1 : (num2 < num3) ? (num1 < num3) ? num1 : num3 : num2;
}
于 2013-09-24T22:26:59.320 回答