Я хочу напечатать целое число в форме треугольника, которое выглядит так
1 121 12321
Я пробовал это, но я не получаю фактического результата
for($i=1;$i<=3;$i++) { for($j=3;$j>=$i;$j--) { echo " "; } for($k=1;$k<=$i;$k++) { echo $k; } if($i>1) { for($m=$i; $m>=1; $m--) { echo $m; } } echo "<br>"; }
Вывод этого кода:
1 1221 123321
Где я ошибаюсь, пожалуйста, направляйте меня.
Другое целочисленное решение:
$n = 9; print str_pad ("✭",$n," ",STR_PAD_LEFT) . PHP_EOL; for ($i=0; $i<$n; $i++){ print str_pad ("", $n - $i); for ($ii=-$i; $ii<=$i; $ii++){ if ($i % 2 != 0 && $ii % 2 == 0) print "&#" . rand(10025,10059) . ";"; else print $i - abs($ii) + 1; } print PHP_EOL; } ✭ 1 1✬1 12321 1❊3✪3✳1 123454321 1✼3✶5❃5❈3✸1 1234567654321 1✾3✯5✿7❉7✫5✷3✶1 12345678987654321
Если у вас уже есть строка, вы можете:
$n = 9; $s = "12345678987654321"; $i = 1; while ($i <= $n) echo str_pad ("", $n-$i) . substr ($s,0,$i - 1) . substr ($s,-$i++) . PHP_EOL;
Ваш код должен быть следующим:
for($i=1;$i<=3;$i++) { for($j=3;$j>$i;$j--) { echo " "; } for($k=1;$k<$i;$k++) /** removed = sign*/ { echo $k; } if($i>=1) /**added = sign*/ { for($m=$i; $m>=1; $m--) { echo $m; } } echo "<br>"; }
Попробуй это.
Детали:
Ваша петля неправильна, как в случае for($k=1;$k<=$i;$k++)
, это будет печатать повторяющееся число, когда вы проверяете условие на меньшее и снова равное. Поэтому удалите знак равенства.
Причина добавления знака eqaul в if($i>=1)
заключается в том, что первый элемент не будет печататься, если не будет равным, так как сначала он будет печатать по циклу, откуда удаляется знак равенства.
Ваш результат будет следующим:
1 121 12321
Для всех любителей x-mas:
$max = 9; # can be 2 .. 9 for($i = 1; $i <= $max; $i++) { $line = (str_pad('', $max - $i)); for($ii = 1; $ii <= $i; $ii++) { $line .= $ii; } for($ii = $i-1; $ii > 0; $ii--) { $line .= $ii; } echo $line . PHP_EOL; }
Вывод:
1 121 12321 1234321 123454321 12345654321 1234567654321 123456787654321 12345678987654321
Удивительно, что компьютеры могут достичь в наши дни! Не так ли?
Немного поздно для вечеринки, но вот еще одно решение, которое использует цикл «for» с двумя переменными инициализации и трехмерным приращением / декрементом. Это неортодоксальное использование цикла «для», но оно по-прежнему абсолютно корректно и, возможно, делает код более изящным и понятным. Я решил добавить пространство до и после каждой точки с запятой и опустить все другое пространство внутри круглых скобок, чтобы было легче визуализировать каждую из трех частей цикла «for» (инициализация, условие, приращение / декремент):
$count = 9; echo "<pre>"; for ($i=1; $i<=$count; $i++) { echo str_pad("",$count-$i," ",STR_PAD_LEFT); for ( $j=1,$up=true ; $j>0 ; $up?$j++:$j-- ) { echo $j; if ($j==$i) {$up = false;} } echo "<br>"; } echo "</pre>";
Вывод:
1 121 12321 1234321 123454321 12345654321 1234567654321 123456787654321 12345678987654321