现有一区间:$start--$end (例:5--10)。
给一变量$param:
如果$param<$start 则$param=$start
如果$param>$end 则$param=$end
不用if else,三元 等逻辑算法(虽然简单并且效率也高)
求实现此要求的数学算法
给一变量$param:
如果$param<$start 则$param=$start
如果$param>$end 则$param=$end
不用if else,三元 等逻辑算法(虽然简单并且效率也高)
求实现此要求的数学算法
解决方案 »
- php cookie
- 今天还没开新帖,开一贴送20分
- PHP与MySQL组合查询出错,请教!(已按范例建好对应的数据库,附源码)谢谢了!
- 用什么命令查看PHP版本?
- php中关于换行符及回车的处理
- 求救PHP获取IP的方法,用getenv(remote_addr);提示出错
- 如何分析出html源码中的<img>的个数,并修改图片的路径
- 如何 在 文本框中輸入內容時,獲得 輸入的文本內容,並到 MySql 中查詢是否有,字段的值與其相同的記錄,並返回查詢結果((急))
- thinkphp调用数据库出错
- php5.4+apache2.4+Navicat 8.2 MySQL
- 大神们,帮我解决个问题!网站访客的统计的问题
- 对象不存在的问题
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。所以不成立。
蛋疼了
x = y (y在[5,10]区间)
x = 10 (y >= 10)
------------------------------------------------------------
楼主画个坐标图,基本相当于闪电模样的一个曲线(下图),学几何的时候没见过这种曲线方程。。
|
|
|
/(10)
/
/
|(5)
|
|
|
|
x=a+1;
x=b-1;
且a<b,
值很多....
答案是肯定的。否则我也不会将他置顶了我先来个抛砖引玉
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
$param = 4;
echo min(max($param,5),10);
就行了吧。
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;
}
foolbirdflyfirst有码了啊。你还写
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这没用任何函数拉。
我去求经得到的,
算法有待研究。
所求结果 为 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
不懂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只是感觉这样效率很低...
如9楼所言,如果楼主要的是数学算法的话,这种
—— —— —— —— —— —— ——
/
/
/
/
/
—— —— —— —— —— —— ——
类似的函数曲线还真是没见过啊,
只能是分段函数了,分为三段,这样貌似就得用if else了。
{
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
{
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;
}
//过滤掉全部的负数,即:当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>");
}
?>
function houhou($start,$end,$x)
{return abs($x-$start)/2-abs($x-$end)/2+$start/2+$end/2; }
<?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);
不过用到了数组的一个特别特性...我的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]) ;
}
$param=($param<=$start)*$start+($param>=$end)*$end+($param>$start&&c<$end)*$param;
switch($param){
case $param < $start:
$param = $start;
break;
case $param > $end:
$param = $end;
break;
default:
return $param;
}
return $param;
}楼主 貌似要做分页?
跟max,min是一个故事哈.....不过能想到这个很不错.我也想到这个了.
而 switch 却是的
而且楼主出的难点在于“逻辑运算”一律不能使用
貌似现在的运算以及判断,都是建立在“逻辑运算”基础上的,
这实在是一个很令人郁闷、忐忑、晕菜、费解的提议。
memset(reg+5,1,5)char is_value_in_reg(char v)
{
return reg[v];
}
目的:无
价值:体现在过程中
结果:可能在这个过程中产生有用的思想和方法,也可能没有;可能会使参与者的能力在这个过程中得到训练和提高,也可能没有。
————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
求证:(|x-a|-|y-a|+(x+y))/2∈[x,y](x,y属于实数)
不知道php里边有没有switch case ,这个应该有的吧!!
直接汇编指令:
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: