1

この質問を簡単にするために、配列から false を返した数に最も近い三角数を提案する php を探しています。

たとえば、元の数値の値が 54 (三角形ではない) の場合、これに適合する配列から最も近い 2 つの変数を 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 />";} 
?>
4

1 に答える 1

0

単純な方法は、配列内の各数値の差を計算し、差が最小のインデックスを選択することです。

より良いアプローチは、三角数列の式 ((n²+n)/2 = t) を使用することです。n について解くと、次のようになります。

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

次に、n を計算し、四捨五入 (切り上げまたは切り捨て) して、シーケンスの数式に入れることができます。ほら、あなたはあなたに最も近い三角数を持っています。

例えば

$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
于 2012-08-02T17:28:54.150 に答える