2

数値と合計の配列を単純なステートメントに変換する必要があります。

たとえば、次のコードを、PHP を介してプログラムで、、、、さらには丸め (9000,400000 など) のような単純なステートメントに変換するにはどうすればよいでしょ1 out of 101 out of 1002 out of 100

サンプル配列の生成:

$arr = array();
for ($i=0; $i < 100; $i++) {
    $n = mt_rand(1,1000);
    $t = mt_rand(10,100000);
    if ($n > $t) continue; // skip!
    $arr[] = array($n,$t);
}
/*
// Generates pairs like:
// Array
// (
//     [0]  => Array ( [0] => 55  [1] => 8774  )
//     [1]  => Array ( [0] => 814 [1] => 11174 )
//     [2]  => Array ( [0] => 255 [1] => 32168 )
//     ...
//     [99] => Array ( [0] => 851 [1] => 24231 )
// )
*/

関数を実行し、単純化された結果を出力します。

foreach ($arr as $a) {
    echo $a[0] . '/' . $a[1] . ' ==> ' . simplifyRatio($a[0],$a[1]) . "\r\n";
}

これを達成する方法について正しい方向に私を向けることができますか?

これが私が取り組んでいる機能の始まりですが、解決策は私を逃れています。

function simplifyRatio($n,$t) {
    $p = $n/$t;
    if ($p > 0.09) return round($n) . ' out of ' . round($t);
    if ($p > 0.009) return round($n) . ' out of ' . round($t);
}

理想的には、分母は次のようになります。1,2,3...10,20,30...100,200,300...1000,2000,3000...10000,20000,30000...100000 (max)

4

3 に答える 3

1

簡単にするために、割合を分数で取得できると仮定します (つまり、25% は 25/100、0.7% = 7/1000 など)。

ユークリッドのアルゴリズムを使用して、分子と分母の GCD を見つけることができます: http://en.wikipedia.org/wiki/Euclidean_algorithm

php では、次のようになります。

function gcd ($int1, $int2) {
    $tmp = 0;
    while ($int1 > 0) {
        $tmp = $int1;
        $int1 = $int2 % $int1;
        $int2 = $tmp;
    }
    return $int2;
}

これは、$int1 と $int2 が 0 より大きい整数である限り機能します (これを確実にするために何らかのロジックを追加することをお勧めします)。負の数が必要な場合は、絶対値を取ります。

GCD を知っていれば、あとは簡単に理解できます。

function reduce($numerator, $denominator) {
    $gcd = gcd($numerator, $denominator);
    echo ($numerator/$gcd) . " out of " . ($denominator/$gcd);
}
echo reduce(4, 8).'<br>'; // 1 out of 2
echo reduce(38, 897).'<br>'; // 38 out of 897
echo reduce(39, 26).'<br>'; // 3 out of 2

お役に立てれば!

于 2013-02-15T22:32:41.640 に答える
1

常にパーセンテージを想定しています。表示する前にsprintf することもできます$outof

function convertPercent($iPercent)
{
  // Assume validation on $iPercent
  $outof = round(100 / $iPercent);
  return "1 out of $outof";
}
于 2013-02-15T20:13:02.227 に答える
0

私は次のように、パターンのほぼ一致に落ち着きました1 out of ___

function simplifyRatio($n,$t) {
    $r = $t/$n;
    return '1 out of ' . round($r);
}

// Examples:
$arr = array();
for ($i=0; $i < 100; $i++) {
    $n = mt_rand(1,1000);
    $t = mt_rand(10,100000);
    if ($n > $t) continue; // skip!
    $arr[] = array($n,$t);
}
foreach ($arr as $a) {
    echo $a[0] . '/' . $a[1] . ' ==> ' . simplifyRatio($a[0],$a[1]) . "\r\n";
}

結果の例:

1000/24819 ==> 1 out of 25
309/50305 ==> 1 out of 163
488/99123 ==> 1 out of 203
322/47610 ==> 1 out of 148
183/54287 ==> 1 out of 297
752/67646 ==> 1 out of 90
240/68854 ==> 1 out of 287
301/81345 ==> 1 out of 270
611/16404 ==> 1 out of 27
522/62992 ==> 1 out of 121

CodePad:http ://codepad.org/wu6iOdDq

当初は分母が丸みを帯びたもの(10,20 ... 100,200 ... 1000,2000など)になることを望んでいましたが、これをうまく行う方法がわかりません。上記の分母をきれいにする答えを喜んで授与します。

于 2013-02-15T20:55:38.343 に答える