编辑: 奇怪的是,有人正在读这个,我想补充一点。 假设有问题的三个值已经在内存中并且没有被更改,我已经计算了不少于14条指令才能实现这一壮举。
如果有人可以的话,我非常喜欢这个。
[热门编辑结束]
问题很简单。我有三个整数值,我需要找到最大和最小的值。最大的意思是不是最小的或介于两者之间,反之亦然。
由于我无法在网上找到“质量解决方案”,我不得不自己尝试。
if(a > b) {
if(a > c) {
high = a;
if(b > c) {
low = c;
}
else {
low = b;
}
}
else {
if(b > c) {
high = b;
low = c;
}
else {
high = c;
low = b;
}
}
}
else if(a > c) {
if(b > c) {
high = b;
low = c;
}
else {
high = c;
low = b;
}
}
else {
low = a;
if(b > c) {
high = b;
}
else {
high = c;
}
}
假设我没有犯任何错误,这应该使用三个条件解决问题。
假设它按预期工作,我对我的努力非常满意,但我的目的是找到最有效的算法,因此我现在问你那是什么。
最好的问候。
编辑: 我已经回顾了到目前为止提出的解决方案,他们都很好。
到目前为止我最喜欢的。
if(a>b) {
max = a;
min = b;
}
else {
max = b;
min = a;
}
if(c>max)
max = c
else if(c< min)
min = c
如果我没有弄错的话,有2-3个贴纸和2-3个条件。这令人印象深刻。
上述的小修订,使用'a'作为'min'的别名。
if(a>b) {
max = a;
a = b;
}
else {
max = b;
}
if(c>max)
max = c
else if(c< a)
a = c
如果只有一种简单的方法来交换变量......那么,我唯一能想到的就是可以消除'max'的需要,至少在C和C衍生品中,肯定不会有效,除了在内存使用方面,我可以额外花费额外的4个字节。 ;)
答案 0 :(得分:4)
由于你只有3,我会使用类似的东西:
Maximum = max(a, max(b,c))
Minimum = min(a, min(b,c))
我不确定您使用的是哪种语言,但大多数语言都具有最大功能,内置或易于访问。
答案 1 :(得分:3)
if(a>b){swap(a,b); /* in other words: a=a^b;b=a^b;a=a^b; */}
if(a>c){swap(a,c); /*in other words: a=a^c;c=a^c;a=a^c; */}
if(b>c){swap(b,c); /*in other words: b=b^c;c=b^c;b=b^c; */}
//now a is the smallest, c is the largest, but names are changed
high=c;
low=a;
如果你绝望,
void swap(int & x, int & y) //<--- yes it needs to be pass by reference
{
__asm
{
movaps xmm5,[x]
movaps xmm6,[y]
movaps [x],xmm6
movaps [y],xmm5 //i cant say anything without trying ^^
}
return;
}
只有3次比较=较少的cpu错误分支预测和总循环指令将足够小以适应cpu-loop-cache(decode-inst.cache)
答案 2 :(得分:3)
def min_max(a, b, c):
if a > b:
min, max = b, a # two assignments
else:
min, max = a, b # ditto
if c > max:
max = c
elif c < min:
min = c
return (min, max)
答案 3 :(得分:2)
也许
highest = a; lowest = a;
if (b>a)
{
highest = b;
}
else
{
lowest = b;
}
if (c>highest)
{
highest = c;
}
else
{
if (c<lowest)
{
lowest = c;
}
}
答案 4 :(得分:1)
这使用了3次比较和3次或4次分配。
min = max = a;
if a < b
max = b
else
min = b
if b < c
if c > a:
max = c
else
if c < a:
min = c
答案 5 :(得分:1)
此解决方案使用2
到3
之间的比较。
返回值是夫妻(最小,最大)。
a
和较大的b
。c
。答案 6 :(得分:0)
计算/枚举开关应该给编译器足够的自由来最小化(条件)跳转量:
#include <stdio.h>
static inline void minmax3(int*themin,int*themax, int a, int b, int c)
{
switch(
1 * (a>b)
+ 2 * (a>c)
+ 4 * (c>b)
) {
case 0: *themin = a; *themax = b; break;
case 1: *themin = b; *themax = a; break;
case 2: *themin = c; *themax = b; break;
case 3: *themin = b; *themax = a; break;
case 4: *themin = a; *themax = c; break;
case 5: *themin = b; *themax = c; break;
case 6: *themin = b; *themax = c; break;
case 7: *themin = b; *themax = a; break;
}
return ;
}
int main(void)
{
int a,b,c,mi,ma;
for (a=0; a <3; a++) {
for (b=0; b <3; b++) {
for (c=0; c <3; c++) {
minmax3( &mi, &ma, a, b, c);
printf("a=%d b=%d c=%d min=%d max=%d\n"
, a, b, c, mi, ma
);
}}}
return 0;
}
答案 7 :(得分:0)
if(a>=b)
{if(a>=c)
{MAX=a;
MIN=c;
if(c>=b)
MIN=b;
}
else
MAX=c,MIN=b;
}
else
{if(b>=c)
{MAX=b;
MIN=c
if(c>=a)
MIN=a;
}
else
MAX=c,MIN=a;
}