如果if语句返回false,则建议从数组中匹配最接近的'correct'数字

时间:2012-08-02 17:17:58

标签: php

为了简化这个问题,我正在寻找php来建议从数组中得到的最接近的三角数到返回false的数字。

例如,如果原始数字的值是54(不是三角形),我希望php从一个适合这个的数组中选择最近的两个变量:55是,所以是45.然后回显它们作为建议。 我怎样才能做到这一点?

要提供一些背景信息,这是我当前的代码:

<?php 
$x = 54;
$area = $x * 8;
$ans1 = sqrt(1 + $area) -1;
$ans2 = sqrt(1 + $area) +1;

$answer1 = $ans1 / 2;
$answer2 = -$ans2 / 2;
$answer3 = $answer1 + $answer2;

    if ( is_numeric( $answer2 ) && strpos( $answer2, '.' ) === false ){
        echo "$x is Triangular <br /> <br />";
            if ($answer2 > $answer1) {echo "Total number of glasses per side: ".$answer2."<br />";}
            if ($answer2 < $answer1) {echo "Total number of glasses per side: ".$answer1."<br />";}
            }
    else {
        echo "$x is not Triangular <br /> <br />";} 
?>

1 个答案:

答案 0 :(得分:0)

一种天真的方法是计算数组中每个数字的差异,然后选择差异最小的索引。

更好的方法是使用三角数序列的公式((n²+ n)/ 2 = t)。 解决n,你得到:

n = 0.5 (±sqrt(8t+1)-1)

然后,您可以计算n,将其四舍五入(向上或向下),并将其放入序列的公式中。 Voilà,你有最近的三角形数字。

e.g。

$input = 54;
$n = round(0.5*(sqrt(8*$input+1)-1));
$t = $n*($n+1)/2;

echo $t; // 55

分别选择周围的值floorceil

$input = 54;
$n1 = floor(0.5*(sqrt(8*$input+1)-1));
$n2 = ceil(0.5*(sqrt(8*$input+1)-1));
echo $n1*($n1+1)/2; // 45
echo $n2*($n2+1)/2; // 55