免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: HappyWin
打印 上一主题 下一主题

不用判断语句,求两个数的最大值  关闭 [复制链接]

论坛徽章:
29
戌狗
日期:2013-11-14 09:53:052016科比退役纪念章
日期:2016-07-12 18:29:4415-16赛季CBA联赛之新疆
日期:2016-11-07 13:15:0015-16赛季CBA联赛之辽宁
日期:2017-01-18 10:23:5115-16赛季CBA联赛之吉林
日期:2017-05-02 14:02:2319周年集字徽章-年
日期:2020-01-15 13:50:582016科比退役纪念章
日期:2021-06-03 14:15:3115-16赛季CBA联赛之山东
日期:2021-06-21 17:30:5615-16赛季CBA联赛之江苏
日期:2021-06-22 16:42:2015-16赛季CBA联赛之深圳
日期:2021-12-21 15:54:0215-16赛季CBA联赛之佛山
日期:2022-04-08 09:43:5715-16赛季CBA联赛之广东
日期:2022-06-29 19:59:19
161 [报告]
发表于 2005-06-07 21:10 |只看该作者

不用判断语句,求两个数的最大值

不好意思,不会引用。
我考虑了溢出的情况。这个算法的主要思路是根据需要比较的两个整数的符号(x,y的最高位)和它们之间的差值的正负(z的最高位)来做比较的,在预先定义的表(arr[8],相当于一张状态图)中查找相应值。

论坛徽章:
29
戌狗
日期:2013-11-14 09:53:052016科比退役纪念章
日期:2016-07-12 18:29:4415-16赛季CBA联赛之新疆
日期:2016-11-07 13:15:0015-16赛季CBA联赛之辽宁
日期:2017-01-18 10:23:5115-16赛季CBA联赛之吉林
日期:2017-05-02 14:02:2319周年集字徽章-年
日期:2020-01-15 13:50:582016科比退役纪念章
日期:2021-06-03 14:15:3115-16赛季CBA联赛之山东
日期:2021-06-21 17:30:5615-16赛季CBA联赛之江苏
日期:2021-06-22 16:42:2015-16赛季CBA联赛之深圳
日期:2021-12-21 15:54:0215-16赛季CBA联赛之佛山
日期:2022-04-08 09:43:5715-16赛季CBA联赛之广东
日期:2022-06-29 19:59:19
162 [报告]
发表于 2005-06-07 21:12 |只看该作者

不用判断语句,求两个数的最大值

zleil的算法应该是和我一个思路。

论坛徽章:
0
163 [报告]
发表于 2005-06-07 21:17 |只看该作者

不用判断语句,求两个数的最大值

[quote]原帖由 "wxycyel"]zleil的算法应该是和我一个思路。[/quote 发表:


哈哈,我是偷的你的思路啊。

先确定去符号后的大小比较,这个思路太好了!!!

论坛徽章:
29
戌狗
日期:2013-11-14 09:53:052016科比退役纪念章
日期:2016-07-12 18:29:4415-16赛季CBA联赛之新疆
日期:2016-11-07 13:15:0015-16赛季CBA联赛之辽宁
日期:2017-01-18 10:23:5115-16赛季CBA联赛之吉林
日期:2017-05-02 14:02:2319周年集字徽章-年
日期:2020-01-15 13:50:582016科比退役纪念章
日期:2021-06-03 14:15:3115-16赛季CBA联赛之山东
日期:2021-06-21 17:30:5615-16赛季CBA联赛之江苏
日期:2021-06-22 16:42:2015-16赛季CBA联赛之深圳
日期:2021-12-21 15:54:0215-16赛季CBA联赛之佛山
日期:2022-04-08 09:43:5715-16赛季CBA联赛之广东
日期:2022-06-29 19:59:19
164 [报告]
发表于 2005-06-07 21:21 |只看该作者

不用判断语句,求两个数的最大值

我也是在大家先前发的贴子的启发下才想到这个方法的。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
165 [报告]
发表于 2005-06-07 21:27 |只看该作者

不用判断语句,求两个数的最大值

[quote]原帖由 "wxycyel"]我也是在大家先前发的贴子的启发下才想到这个方法的。[/quote 发表:

所以说看一下别人的东西还是有好处的吧?^_^
不然不会这么无聊的一个贴子顶到现在!

论坛徽章:
0
166 [报告]
发表于 2005-06-07 22:24 |只看该作者

不用判断语句,求两个数的最大值

这段代码的简单说明:

  1. #define MASK 0x7fffffff
  2. int max (int x, int y)
  3. {
  4.   int z;

  5.   z =  (x>;>;31) - (y>;>;31) + (((x&MASK) - (y&MASK))>;>;31);
  6.   z= (z+1)*(z+2)*(3-2*z)/6;
  7.   return z*x + (1-z)*y;

  8. }
复制代码


思路:计算 x-y 的差,自己处理进位:

第一行:

(((x&MASK) - (y&MASK))>;>;31) 计算低 31 位相减后的符号,0 或 -1。也可以看成低 31 位相减后对高位的  借位。

(x>;>;31) - (y>;>;31) 是第 32 位的差,带符号扩展

z =  (x>;>;31) - (y>;>;31) + (((x&MASK) - (y&MASK))>;>;31);

处理进位.


第二行:

可以分析出,z 有四种可能的值,1, 0, -1, -2。其中

1, 0 对应 x>;=y, -1, -2 对应 x < y

我对 z 作一个修正,即一个映射,把 1, 0 对应为 1; -1, -2 对应为 0。映射可用 Lagrange 插值公式得到。


第三行:
还是 Lagrange 插值, 1 ->; x, 0 ->; y



ps>; 第二行也可以直接从最高位判断正负。

论坛徽章:
0
167 [报告]
发表于 2005-06-07 22:26 |只看该作者

不用判断语句,求两个数的最大值

yuxh 的算法很精彩,技巧性很强。我看了半天才明白(在注释的帮助下)。

论坛徽章:
0
168 [报告]
发表于 2005-07-18 18:03 |只看该作者

不用判断语句,求两个数的最大值

http://community.csdn.net/Expert ... 5.xml?temp=.7769739
大家可附带解决一下这个问题,CU讨论的比CSDN深多了。
还是CU牛人多!

论坛徽章:
0
169 [报告]
发表于 2005-07-20 18:22 |只看该作者

不用判断语句,求两个数的最大值

#include <set>;
using namespace std;
#include <iostream>;
int main(){

    int s[2]={5 , 3 };
    set<int>; _set(s ,s+2);
    set<int>;::iterator it;
    it=_set.begin();
    cout<<(int)(*(++it))<<endl;
}

论坛徽章:
0
170 [报告]
发表于 2005-07-21 09:45 |只看该作者

不用判断语句,求两个数的最大值

这是茴香豆的茴字的第5中写法,哈哈。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP