我正在尝试编写一个输入特定销售额的程序,并根据三个支付率计划进行一些计算。我想提出的一件事是找出三个计划的中位数的方法。因此,如果plan1 = 200,plan2 = 250,plan3 = 300,我希望计算机知道中位数是250.如果有人可以帮助我使用算法或预先构建的函数,我将非常感激。< / p>
答案 0 :(得分: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;
答案 1 :(得分: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;
}
答案 2 :(得分: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;
}