从比较两数想到的

do_fork 2009-11-22 09:24:00
int cmp(int a, int b);

/*
a>b时返回1
a=b时返回0
a<b时返回-1
*/


很容易想到if-else,或者是?:运算符,其实两者是同一语法的不同形式。

或者利用C语言的逻辑运算特点,真值返回1,假值返回0
(a>b)*1 + (a<b)*-1

更一般的,如果不是返回1,0,-1,而是返回x,y,z
可以这么做
(a>b)*x + (a==b)*y + (a<b)*z


如果不是a,b两个,而是有a1,a2,a3,a4,.....an n个变量,
可能返回值也不是3个,而是r1,r2,r3,.....rm 个可能的值。
m个条件分别为c1,c2,c3,c4,....cm

这个时候还是用if-else吗? 显然不用写这么冗长的语句。

int cmp(int a1, int a2, int a3, ...)
{
int rets[]={r1,r2,r3,...,rm};
ridx = c1*0 + c2*1 +c3*2 + c4*3 + .....;
return rets[ridx];
}


这么做有个缺点,就是要把所有的可能性都计算一遍再相加,我们当然不能傻乎乎的这么做。

int cmp(int a1, int a2, int a3, ...)
{
int rets[]={r1,r2,r3,...,rm};
for (i=0; ; i++)
if (ci)
return rets[i];
}


为什么不用 for (i=0; i<m; i++) 呢,
理由有2,
一,删除循环中的条件测试,可以提高性能。
二,所有的条件中,一定会有一个是成立的。

更进一步,条件ci也可以是函数指针,用于实现更加复杂的判断逻辑,
ci中的测试,也可以有个优先级,即某一参数组合能同时满足多组测试,返回优先级最高的那个。

将所有变量加权,然后按照一定规则求和,最后根据和,直接查表得到答案,
进制也是加权的一种特殊形式,不同的位,代表不同权,2进制加权的使用很常见,
其它进制的也有,著名的12个球,一个天平,一个球质量不同于其它球,称3次找出那个球,
其中一种解法,就是3进制的应用。

小学奥数里有大量加权求和找次品的题,没想到那些对编程也有帮助
...全文
118 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzywsk 2009-11-23
  • 打赏
  • 举报
回复
学习下~~
delphiwcdj 2009-11-23
  • 打赏
  • 举报
回复
thanks for sharing!
jzd8000 2009-11-23
  • 打赏
  • 举报
回复
学习一下!
do_fork 2009-11-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 baihacker 的回复:]
为什么不用  for (i=0; i <m; i++) 呢,
理由有2,
一,删除循环中的条件测试,可以提高性能。
二,所有的条件中,一定会有一个是成立的。

在TAOCP上对这个问题还有进一步优化...
[/Quote]

编程珠玑上也有类似讨论,最后消去了循环
lovesi3344 2009-11-22
  • 打赏
  • 举报
回复
呵呵
很少看到你发帖子
今天看到了,问题点数却是0分
。。。。。。。
baihacker 2009-11-22
  • 打赏
  • 举报
回复
关于三进制的应用还有这些:
给定 1, 3, 9, 27,...,3^19的砝码,称指定重量的物品(量程范围之内).
给定1,6,9三个数,能组成的第k大的数是多少.
baihacker 2009-11-22
  • 打赏
  • 举报
回复
为什么不用 for (i=0; i <m; i++) 呢,
理由有2,
一,删除循环中的条件测试,可以提高性能。
二,所有的条件中,一定会有一个是成立的。

在TAOCP上对这个问题还有进一步优化...
baihacker 2009-11-22
  • 打赏
  • 举报
回复
从你的分析想到了在我的生日邀请赛上的题....

给定定义在一个区域上的函数f(x, y),比如一个描述波的函数.
其本身的性状是比较复杂的.
于是我们把区域分为很多小三角形,如果三角形够多.那么这个函数限定在小三角形上就是线性的.
现在的问题是,已经f在三角形三点处的值,找一个线性的函数g,使得这个函数在三点处的值和f相等
于是在三角形内部的值就可以用g的值代替f的值.
现在的问题是如何找这个g.

考虑这样的函数LA,LB,LC,LA在A处的值为1,在BC处的值为0,LB,LC类似.
f在A,B,C处的值分别为fa, fb, fc.
那么g = fa*LA+fb*LB+fc*LC.

一个点的面积坐标的第一个分量正好满足LA的需求...

现在在结点处的值是不知道的.于是可以用假设出来的这个,去满足原来的关系.然后就可以得出一个逼近解.

69,373

社区成员

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

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