Как напечатать целое число в форме треугольника

Я хочу напечатать целое число в форме треугольника, которое выглядит следующим образом

    1
   121
  12321

Я пробовал это, но я не получил фактический результат

for($i=1;$i<=3;$i++)
 {
    for($j=3;$j>=$i;$j--)
    {
      echo "&nbsp;&nbsp;";
    }
   for($k=1;$k<=$i;$k++)
    {
      echo $k;
    }
   if($i>1)
    {
      for($m=$i; $m>=1; $m--)
         {
           echo $m;
         }
     }      
    echo "<br>";
}

Вывод этого кода:

   1
  1221
 123321

Где я иду не так, пожалуйста, направляйте меня.

Ответ 1

Другое целочисленное решение:

$n = 9; 
print str_pad ("&#10029;",$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;

Ответ 2

Ваш код должен быть следующим:

for($i=1;$i<=3;$i++)
 {
    for($j=3;$j>$i;$j--)
    {
      echo "&nbsp;&nbsp;";
    }
   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

Ответ 3

Для всех любителей 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

Удивительно, что компьютеры могут достичь в наши дни! Не правда ли?

Ответ 4

Немного поздно для вечеринки, но здесь еще одно решение, которое использует цикл "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