现有一区间:$start--$end  (例:5--10)。
给一变量$param:
如果$param<$start  则$param=$start
如果$param>$end  则$param=$end
不用if else,三元 等逻辑算法(虽然简单并且效率也高)
求实现此要求的数学算法

解决方案 »

  1.   

    不存在这个算法(不使用比较),而且对于解释性的语言来说,也别想着位运算会提高速度了。即使存在,里面必然包含 2个乘法和一次除法,这个时间可比if - else费时。所以,不存在。
      

  2.   

    例:5--10 (x-y)
    a=x-z
    b=y-z假设判断数为1(z)
    因为a大于0,b大于0。所以z=x=5。
    假设判断数为11(z)
    因为a小于0,b小于0。所以z=y=10。
    假设判断数为6(z)
    因为a小于0,b大于0。所以不成立。
    蛋疼了
      

  3.   

    x = 5  (y <= 5)
    x = y  (y在[5,10]区间)
    x = 10 (y >= 10)
    ------------------------------------------------------------
    楼主画个坐标图,基本相当于闪电模样的一个曲线(下图),学几何的时候没见过这种曲线方程。。
       | 
       |
       |
       /(10)
      /
     /
    |(5)
    |
    |
    |
    |
      

  4.   

    a,b E [5,10]
    x=a+1;
    x=b-1;
    且a<b,
    值很多....
      

  5.   

    数学不好,暂时想不到,在不分区间(即不用if)的条件下,此f(x)的解法...坐等数学帝...
      

  6.   

    真的可以做到吗?
    答案是肯定的。否则我也不会将他置顶了我先来个抛砖引玉
    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
      

  7.   

    可以用min,max不是很简单?
    $param = 4;
    echo min(max($param,5),10);
    就行了吧。
      

  8.   

    又学到了不过想想 max min的机制  应该是在内部用逻辑运算来实现的吧
      

  9.   

    一语惊醒梦中人啊
    function getnum($param, $start, $end)
    {
    $min = min($param, $start, $end);
    $max = max($param, $start, $end);

    if ($min == $param)
    {
    $param = $min;
    }

    if ($max == $param)
    {
    $param = $max;
    }

    return $param;
    }
      

  10.   

    =_=...
    foolbirdflyfirst有码了啊。你还写
      

  11.   

    题目说了不能用if else 的哦 亲~
      

  12.   

    不错,如果不可以用min,max呢?
      

  13.   


    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这没用任何函数拉。
    我去求经得到的,
    算法有待研究。
      

  14.   

    分别将 所求数 转化为  下界 进制数 和 上界 进制数,
    所求结果 为 example :   (5,10,x) x=8
    x1 = 13(mod5)
    x2 = 08(mod10)
    answer = (x1msb ⊙ x2msb)*(x1msb*5+x2msb*10)+(x1msb xor x2msb)*x这里的x1msb x2msb需要进行 高位整数除法处理后的结果 才能得到二进制的 0,1
      

  15.   


    不懂PHP...但是这个答案提示也太明显了
    于是写个C版本int的..
    #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 3
    5
    5 10 8
    8
    5 10 13
    10
    -2000000000 2000000000 -1000000000
    -1000000000
    -2000000000 2000000000 1000000000
    1000000000
    -2000000000 2000000000 -2000000001
    -2000000000
    -2000000000 2000000000 2000000001
    2000000000只是感觉这样效率很低...
      

  16.   


    如9楼所言,如果楼主要的是数学算法的话,这种
                              —— —— —— —— —— —— ——
                             /
                            /
                           /
                          /
                         /
    —— —— —— —— —— —— ——
    类似的函数曲线还真是没见过啊,
    只能是分段函数了,分为三段,这样貌似就得用if else了。
      

  17.   

    public static int get(int start, int end, int param)
            {
                param -= start;
                param &= (int)(((uint)param) >> 31) - 1;
                param += start;
                param -= end;
                param &= (int)((((uint)param) >> 31) ^ 1) - 1;
                return param += end;
            }
            public static int get1(int start, int end, int param)
            {
                return new int[] { end, param, start, start }[(((uint)(param - start) >> 30) & 2) | ((uint)(param - end) >> 31)];
            }
    用符号位只能算正数,否则要将int扩展到long
      

  18.   

    不知道这个是不是楼主想要的。int foo(int start, int end, int param)
    {
    int tmp[2]; tmp[0] = param;

    tmp[1] = start;
    param = tmp[(param-start)>>(sizeof(int)*8-1)]; tmp[1] = end;
    param = tmp[(end-param)>>(sizeof(int)*8-1)]; return param;
    }
      

  19.   

    param = ((start+end)-abs(start-end))/2, 其中abs()为取绝对值运算。
      

  20.   

    param = (abs(param-start)-abs(param-end)+start+end)/2;
      

  21.   

    <?php
    //过滤掉全部的负数,即:当x>0时返回x,否则返回0
    function NegativeNumber($x){
    return (abs($x) + $x) / 2;
    }//过滤掉全部的正数,即:当x<0时返回x,否则返回0
    function PositiveNumber($x){
    return ($x - abs($x)) / 2;
    }//选两个数中最大的一个,即当a>b时返回a,否则返回b
    function MyMax($a, $b){
    return (NegativeNumber($a - $b) + NegativeNumber($b - $a) + $a + $b) / 2;
    }function MyMin($a, $b){
    return (PositiveNumber($a - $b) + PositiveNumber($b - $a) + $a + $b) / 2;
    }function MyRange($x, $min, $max){
    return MyMin(MyMax($x, $min), $max);
    }
    $start = 5;
    $end = 10;
    for($i = 0; $i < 20; $i++){
    echo($i);
    echo('=');
    echo(MyRange($i, $start, $end));
    echo("<br>");
    }
    ?>
      

  22.   

    来个简洁的 哈哈
    function houhou($start,$end,$x)
    {return abs($x-$start)/2-abs($x-$end)/2+$start/2+$end/2; }
      

  23.   

    你们这些人....太有闲工夫了....有这时间,M几个L不好吗? 好吧,今天...我也有点闲.....用函数的话,方法很多....所以不用函数...下面这个, 主体都是在cal这个函数里, 其它部分是做测试用.....除了加减乘除,还用到了!和(int), 不过(int)不算函数哦,亲!嗯,30楼的很棒,不过有两个限制,一个是必须是整数,二是必须是32位机.....我这个没有这两个限制哦,亲!随便说一句,淘宝体很好,建议在php论坛推广,大家要支持哦,亲!
    <?php function cal($small,$big,$x){

    $t1=$small * (int)(($small+$small*$small+$x*$x+1)/($x+$small*$small+$x*$x+1));   // $x<=$small  
    $t2=$x * (int)(($x+$small*$small+$x*$x+1)/($small+$small*$small+$x*$x+1));       // $x>=$small
    $t3=$x * (int)(($big+$big*$big+$x*$x+1)/($x+$big*$big+$x*$x+1));   // $x<=$big  
    $t4=$big * (int)(($x+$big*$big+$x*$x+1)/($big+$big*$big+$x*$x+1));       // $x>=$big
    $t5=2*($t2*$t3)/($t2+$t3); return $t1+$t4+$t5*(!(int)($t1+$t4));
    }
    /////////////////////////////////////////////////////////////////////////function check($small,$big,$x){
    return min(max($x,$small),$big);
    }function test($small,$big,$x){ $correct = check($small,$big,$x);

    $display = false;

    $result = cal($small,$big,$x);
    if(abs($result-$correct)>0.000000001){
    $display = true;
    } if($display){
    echo $small,'|',$big,'|',$x,' ==> ',$correct,' = ',$result;
    echo "\n\n";
    }

    }
    test(-20,-10,-28);
    test(-20,-10,-17);
    test(-20,-10,-1);
    test(-20,-10,11);test(-10,3,-200);
    test(-10,3,-2);
    test(-10,3,1);
    test(-10,3,285);test(5,10,-21);
    test(5,10,3);
    test(5,10,5);
    test(5,10,8);
    test(5,10,12); 
    test(5,10,84);test(3.2,6.7,1.0);
    test(3.2,6.7,3.2);
    test(3.2,6.7,3.8);
    test(3.2,6.7,9);test(-11.8,-5.3,-12);
      

  24.   

    好,继续闲.....版本2, 没有再用(int)和!哦, 亲!
    不过用到了数组的一个特别特性...我的php版本是5.3.2,欢迎在不同的版本上测试哦,亲!function cal($small,$big,$x){

    $b[0]=1;
    $b[($x+$small*$small+$x*$x+1)/($small+$small*$small+$x*$x+1)]=0; 
    $tmp = $small * (1-$b[0]) + $x * $b[0] ;
    $b[0]=1;
    $b[($tmp+$big*$big+$tmp*$tmp+1)/($big+$big*$big+$tmp*$tmp+1)]=0; 
    return $big * $b[0] + $tmp * (1-$b[0]) ;
     
    }
      

  25.   

    这有何难  C语言一行搞定
    $param=($param<=$start)*$start+($param>=$end)*$end+($param>$start&&c<$end)*$param;
      

  26.   

    这么多for怎没人用switch?function sss($start,$end,$param){
    switch($param){
    case $param < $start:
    $param = $start;
    break;
    case $param > $end:
    $param = $end;
    break;
    default:
    return $param;
    }
    return $param;
    }楼主 貌似要做分页?
      

  27.   


    跟max,min是一个故事哈.....不过能想到这个很不错.我也想到这个了.
      

  28.   

    楼主已然强调不使用条件判断了
    而 switch 却是的
      

  29.   

    如果不判断,怎么比较两个数的大小?难道用order(),比较ASCII码值?
    而且楼主出的难点在于“逻辑运算”一律不能使用
    貌似现在的运算以及判断,都是建立在“逻辑运算”基础上的,
    这实在是一个很令人郁闷、忐忑、晕菜、费解的提议。
      

  30.   

    投影吧,首次初始化一个数组char reg[10]={0};
    memset(reg+5,1,5)char is_value_in_reg(char v)
    {
         return reg[v];
    }
      

  31.   

    我觉得,这题的意义跟“探索宇宙的边界”是一样的,都具有以下特点:动机:兴趣
    目的:无
    价值:体现在过程中
    结果:可能在这个过程中产生有用的思想和方法,也可能没有;可能会使参与者的能力在这个过程中得到训练和提高,也可能没有。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  32.   

    这不是高中时做过的一道证明题嘛
    求证:(|x-a|-|y-a|+(x+y))/2∈[x,y](x,y属于实数)
      

  33.   

    我看了下,这个比较靠谱点!!不用if..else..
    不知道php里边有没有switch case ,这个应该有的吧!!
      

  34.   

    含条件就需要比较,除非换个说法。
    直接汇编指令:
    CMP param, start
    JS LD
    CMP param, end
    JG GD
    JMP ND
    LD: mov AX,start
    mov param, AX
    JMP ND
    GD: mov AX, end
    mov param,AX
    ND: