2

下のパターンのように星とゼロをエコーし​​ようとしています

*
***0
******00
**********000

アスタリスクの長さは、増加する係数(バルーニング方式)で増加します。つまり、以前のアスタリスクの数に現在の反復回数を加えたものです。

  • 反復1:1(0 + 1)
  • 反復2:3(1 + 2)
  • 反復3:6(3 + 3)
  • 反復4:10(6 + 4)
  • 反復5:15(10 + 5)

ゼロの長さは静的な係数で増加します。

  • 反復1:0
  • 反復2:1
  • 反復3:2
  • 反復4:3
  • 反復5:4

私のコードは現在次のようになっています:

for ($i=0; $i<=10; $i++)
{   
    echo "*";
    for ($j=0; $j<$i; $j++)
    {   
       echo "*";
    }
    for ($z=0; $z<$i; $z++)
    {
        echo "0";
    }       
    echo "</br>";    
} 

しかし、私はこの結果を得ています:

*
**0
***00
****000
*****0000
******00000
4

5 に答える 5

6

星の数は三角数、、、で示され1ます。反復ごとに内部ループの最大値をインクリメントする必要があります。1+21+2+3$i

$k = 0;
for ($i=1; $i<=10; $i++)
{
    $k += $i;
    for ($j=1; $j<=$k; $j++)
    {   
       echo "*";
    }
    ...
}

これは、より直感的であるため 、ループをで1はなくで初期化する必要がある場合にも適しています。ベースのループは、配列を操作しているときに最適に機能します。00

于 2013-03-04T20:52:55.277 に答える
1

このようなものの方が効率的だと思います。星とゼロの現在のシーケンスをキャッシュできます。

$cache_star = "";
$cache_zero = "";
for ($i=1; $i<=10; $i++)
{
    for ($j=1; $j<=$i; $j++)
    {   
       $cache_star .= "*";
    }
    echo $cache_star.$cache_zero;
    $cache_zero .= "0";
}
于 2013-03-04T20:59:27.287 に答える
0

これが私が得たものです:

for($i = 1; $i != 5; $i++)
{
    $triangle = (0.5 * $i) * ($i + 1);
    echo str_repeat('*', $triangle) . str_repeat('0', $i) . PHP_EOL;
}

数式を使用し0.5n(n + 1)ます-三角数の数式。

出力例:

*0
***00
******000
**********0000
于 2013-03-04T21:05:42.943 に答える
0

私は@jordandoyleのアプローチがとても好きです$iが、2番目のstr_replace()..から1を引くことによってゼロパターンを修正します。

コード:(デモ

$number = 5;
for ($i = 1; $i <= $number; ++$i) {
    echo str_repeat('*', $i * .5 * ($i + 1))
         . str_repeat('0', $i - 1)
         . PHP_EOL;
}

出力:

*
***0
******00
**********000
***************0000

この回答が以前の回答と比べて有意な一意性を欠いている場合は、(従来のループの代わりに)再帰的なアプローチも含めます。

コード:(デモ

function printLines($i, $lines = [], $newline = PHP_EOL) {
    if ($i > 0) {
        array_unshift(
            $lines,
            str_repeat('*', $i * .5 * ($i + 1))
                . str_repeat('0', $i - 1)
        );
        printLines(--$i, $lines);
    } else {
        echo implode($newline, $lines);
    }
}

printLines(5);

前の行をコピーして次の行の中央に挿入し、目的のパターンを形成することもできます。これは、@CoertMetzのネストされたループ手法と同等の機能スタイルです。

コード:(デモ

$number = 5;
$line = '';
for ($i = 1; $i <= $number; ++$i) {
    echo (
             $line = str_repeat('*', $i)
                 . $line
                 . ($i > 1 ? '0' : '')
         )
         . PHP_EOL;
}

上記のすべての手法で同じ結果が得られます。

于 2022-02-18T11:12:24.403 に答える
-1

宿題のようなにおいがします...しかし、わかりました、これはどうですか?

$star = "*";

echo $star."\n";

    for ($i=0; $i<=10; $i++)
    {   
        $star = $star."**";
        echo $star;

        echo str_repeat("0", $i+1);

        echo "\n";    
    } 

結果:

*
***0
*****00
*******000
*********0000
***********00000
*************000000
***************0000000
*****************00000000
*******************000000000
*********************0000000000
***********************00000000000

デモ:

http://sandbox.onlinephpfunctions.com/code/583644f782005adb9e018b965cbbdefaf63c7c79

于 2013-03-04T20:54:24.557 に答える