急啊!!如何用加减乘除实现max(a,b)函数求出较大值,不能用if,while等判断语句

ericpenhu 2008-10-19 03:59:14
想了几天了 都没结果啊!!!求教高手帮忙
...全文
854 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
zeedmood 2010-08-29
  • 打赏
  • 举报
回复
新人路过,好多看不懂。只知道3楼也是错的,35楼要在a、b大小相差不到较小数的一倍时才成立(比方说3、5成立但是3、7不成立)。其他以后学了来看~~~~
Sidyhe 2010-08-29
  • 打赏
  • 举报
回复
路过,那么个小问题还有那么多学问
我感觉一个三目运算符就OK了
wibnmo 2010-08-29
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 zhaogengzi 的回复:]

#define MAX(a,b) (((a)-(b)&oX80000000)? (b) : (a))
[/Quote]
这个很不错。。
flysnowhite 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wizardoz 的回复:]
C/C++ code

int max(int a,int b){
int max = 0;
max += ((a + b) / a)* a;
max += ((a + b) / b)* b;

return max;
}
[/Quote]

显然不对,起码当a或b为0时就错误。

使用宏时在运算过程中经常出错(与预期结果不一致),不提倡。

使用位操作,过于复杂,也不好;实现两数交换还可以,但不直观。

(a<=b)*b + (a>b)*a这种方法较好。
final 2010-08-27
  • 打赏
  • 举报
回复
测试一下..

#include <stdio.h>

int max(int a, int b)
{
int v[2] = {a, b};

int idx = ((a - b) >> (sizeof(int) - 1)) & 0x1;

return v[idx];
}

int main(int argc, char** argv)
{
int a = 3;
int b = 7;

printf("max = %d\n", max(a, b));

return 0;
}
final 2010-08-27
  • 打赏
  • 举报
回复
其实我个人感觉不必要非得使用+-*/ 对于+-来说 代价还算低 */来说 代价就比较高了..

#include <stdio.h>

int max(int a, int b)
{
int v[2] = {a, b};

int idx = ((a - b) >> (sizeof(int) - 1)) & 0x1;

return v[idx];
}

int main(int argc, char** argv)
{
int a = 3;
int b = 7;

printf("max = %d\n", max(a, b));

return 0;
}
子庚 2010-08-27
  • 打赏
  • 举报
回复
#define MAX(a,b) (((a)-(b)&oX80000000)? (b) : (a))
子庚 2010-08-27
  • 打赏
  • 举报
回复
#define MAX(a,b) (((a)-(b)&-1)? (b) : (a))
子庚 2010-08-27
  • 打赏
  • 举报
回复
#define MAX(a,b) ((a-b)&-1)? b : a
csucdl 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 sinservice 的回复:]
从数学上讲,这是不可能的,因为max是超越函数,无法用四则运算表示,也许可以用级数表示,但那是近似表达。

计算机也许有可能会,因为计算机整数运算有截断,截断的特性是超越函数。
[/Quote]

支持
  • 打赏
  • 举报
回复
我同意这个![Quote=引用 15 楼 olncy 的回复:]
这个有什么意义呢,使用运算符有可能会导致数据溢出的,不处理的话会使结果不正确
[/Quote]
scu_221 2010-08-27
  • 打赏
  • 举报
回复
若“((a + b) + abs(a -b))/2;”中的隐含判定都不能用的话,估计无解,35楼的测试为假测试,若其测试的a和b值互换,即错。
LWBOSS 2010-08-27
  • 打赏
  • 举报
回复
笔误太多了,还没改完: 又修改一下

最大值 = !标志位*a + 标志位*b; //如果标志位为零则 最大值=a,如果标志位为1则 最大值=b


这种方法完全不需要用到任何形式的判断语句,
补充一下,楼主请一定要记得给分给我,谢谢
LWBOSS 2010-08-27
  • 打赏
  • 举报
回复
上面的回复中有很多错误修改一下

int 标志位;
int 最大值;
标志位 = 提取标志位(a - b); //如果a>=b 则标志位为零, a<b则为1
最大值 = !标志位*a + 标志位*b; //如果标志位为零则a=a,如果标志位为1则a=b

这种方法完全不需要用到任何形式的判断语句,
LWBOSS 2010-08-27
  • 打赏
  • 举报
回复
可以不用判断语,(隐含语句也不需要用,要知道数学是可以实现一切的)
你的问题可以这样实现:

int 提取标志位(); //这个函数的实现就不写了,需要用到位域结构体和指针

实现方法如下:
int 标识位;
int 最大值;
标志位 = 提取标志位(a - b); //如果a>=b 则标志位为零, a<b则为1
最大值 = a; //假设a最大
a = !标志位*a +标志位*b; //如果标志位为零则a=a,如果标志位为1则a=b




「已注销」 2010-08-27
  • 打赏
  • 举报
回复
从数学上讲,这是不可能的,因为max是超越函数,无法用四则运算表示,也许可以用级数表示,但那是近似表达。

计算机也许有可能会,因为计算机整数运算有截断,截断的特性是超越函数。
SongSaiGa 2010-08-20
  • 打赏
  • 举报
回复
这个跟我想的一样:(a>=b)*a+!(a>=b)*b
[Quote=引用 16 楼 qiuqiu19870120 的回复:]
#include "stdafx.h"
#include "stdio.h"
#include "math.h"
int main(int argc, char* argv[])
{
int max(int,int);
int d=6,f=8;
printf("max(%d,%d)=%d\n",d,f,max(d,f));
return 0;
}
int max(int a, ……
[/Quote]
qiuqiu19870120 2010-08-20
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "stdio.h"
#include "math.h"
int main(int argc, char* argv[])
{
int a = 25, b= 28;
int max(int a,int b);
printf("max(%d,%d)=%d\n",a, b,max(a,b));
return 0;
}
int max(int a,int b)
{
return -(((a-b)>>31)*b+((b-a)>>31)*a);
}
qiuqiu19870120 2010-08-20
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
int a = 20,b= 19;
int max(int a,int b);
printf("max(%d,%d)=%d\n",a, b,max(a,b));
return 0;
}
int max(int a,int b)
{ int x[2]={0,0};

int p1=(b-a)>>31 & 0x00000001;
x[p1]=a;
x[1-p1]=b;
return x[1];
}
boliang319 2010-08-20
  • 打赏
  • 举报
回复
int f(int a, int b)
{
int array[2];
array[0] = a;
array[1] = b;
int c = (unsigned int)(a - b) & 0x80000000 >> 31; // if (a >= b) then c = 0; else c = 0;
return array[c]; // if (0 == c) then return a; else return b;
}
加载更多回复(41)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧