听说阿里云社区里有很多牛人,今天有点无聊,上来求一算法,各位大虾看题
现有一区间:$start--$end (例:5--10)。
给一变量$param:
如果$param<$start 则$param=$start
如果$param>$end 则$param=$end
不用if else,三元 等逻辑算法(虽然简单并且效率也高)
求实现此要求的数学算法
<?php
function demo($param, $start , $end) {
$param < $start && $param = $start ;
$param > $end && $param = $end;
return $param;
}
echo demo(3, 5, 10); // 5
echo demo(15, 5, 10); // 10
echo demo(5, 11, 4); // 4,这就是不足之处!
小弟不才,忘记什么叫逻辑算法了,不知道这个算不算!
function sss($start,$end,$param){
switch($param){
case $param < $start:
$param = $start;
break;
case $param > $end:
$param = $end;
break;
default:
return $param;
}
return $param;
}
#include<stdio.h>
int middle(int a,int b,int c)
{
long long la=a;
long long lb=b;
long long lc=c;
long long f1=(lc-la)>>63&0x1;
long long f2=(lb-lc)>>63&0x1;
long long f3=1^(f1+f2);
return f1*a+f2*b+f3*c;
}
int main()
{
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c))
{
printf("%d\n",middle(a,b,c));
}
}
转为longlong 是为了防止溢出测试如下:5 10 355 10 885 10 1310-2000000000 2000000000 -1000000000-1000000000-2000000000 2000000000 10000000001000000000-2000000000 2000000000 -2000000001-2000000000-2000000000 2000000000 20000000012000000000只是感觉这样效率很低...
$param = 4;
echo min(max($param,5),10);
就行了吧
function foo($a, $b, $c) {
$f1 = -(($c - $a) >> 31);
$f2 = -(($b - $c) >> 31);
$f3 = 1 ^ ($f1 + $f2);
return $f1 * max($a, $c) + $f2 * min($b, $c) + $f3 * $c;
}
echo foo(5, 10, 3); //5
echo foo(5, 10, 8); //8
echo foo(5, 10, 13); //10
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
function foo($a, $b, $c) {
Return (((($c-$a) + (($c-$a) >> 31)) ^ (($c-$a) >> 31)) - ((($c-$b) + (($c-$b) >> 31)) ^ (($c-$b) >> 31)) + $a + $b) / 2;
}
echo foo(20, 30, 50); // 30
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。