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