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进制的应用。
小学奥数里有大量加权求和找次品的题,没想到那些对编程也有帮助