3

我需要使用星号创建一个金字塔。我指定了一个值,它成为金字塔的基础。基数包含与指定值一样多的星号,金字塔必须将其行跳过 1..当我指定偶数个基数时,我遇到了一个问题。

金字塔必须看起来像下面的那个。

    * 
   *** 
  ***** 
 ******* 
********* 
********** 

我正进入(状态

####* 
###*** 
##***** 
###***** 
####***** 
********** 

我想用一些空格替换 # 并且我得到了第 4 行中星号数量减少的错误。如何修复这两个错误?

function create_pyramid($limit){

     if ($limit > 0){
        for ($row =0;$row<=$limit;$row++){
            if (($row % 2 == 0) && ($row != $limit)){ continue;}
            $rows = "";
            for ($col =0;$col<$row;$col++){
                $rows= $rows.'*';
            }
            $pattern = "%'#".((($limit - $row)/2)+$row)."s\n";
            printf ($pattern,$rows);
            print '<br />';
        }
        }
        else{
            print "Invalid data";
        }
     }

     create_pyramid(10);
4

14 回答 14

9

我更喜欢我的:

  echo '<pre>';

  $n = 5;
  function print_tree($n, $str, $max) {
    for ($i = 0; ($i < (($max - $n) / 2)); $i++) {
      echo "&nbsp;";
    }
    for ($i = 0; ($i < $n); $i++) {
      echo $str;
    }
    echo "<br/>";
  }

  for ($flag = 0; ($flag < 2); $flag++) {
    for ($a = 1, $b = 1, $c = 1, $d = 4; (($d - 3) <= $n); $a += 2, $b++) {
      if ($flag == 1) {
        print_tree($a, "*", $max);
      }
      if ($b == $d) {
        if ($flag == 0) {
          $max = $a;
        }
        if (($d - 3) != $n) {
          $a -= ((2 * $c) + 2);
        }
        $b = 0;
        $d++;
        if (($d % 2) == 0) {
          $c++;
        }
      }
    }
  }
  if ((($foot = $n) % 2) == 0) {
    $foot++;
  }
  for ($i = 0; ($i < $foot); $i++) {
    print_tree($foot, "|", $max);
  }

输出:

                   *
                  ***
                 *****
                *******
                 *****
                *******
               *********
              ***********
             *************
              ***********
             *************
            ***************
           *****************
          *******************
         *********************
           *****************
          *******************
         *********************
        ***********************
       *************************
      ***************************
     *****************************
       *************************
      ***************************
     *****************************
    *******************************
   *********************************
  ***********************************
 *************************************
***************************************
                 |||||
                 |||||
                 |||||
                 |||||
                 |||||

甚至这个:

<?php

$n = 8;

ob_start();

$stars = ($n - 1) * 2 + 1;
$spaces = 0;
for ($i = 0; ($i < $n); $i++) {
    echo str_repeat(' ', $spaces);
    echo str_repeat('*', $stars);
    echo ' ';
    echo str_repeat(' ', $spaces * 2);
    echo str_repeat('*', $stars);
    echo "\n";
    $spaces += 1;
    $stars -= 2;
}

$stars = ($n - 1) * 2 + 1;
$spaces = 0;
$margin = $stars / 2 + 1;
for ($i = 0; ($i < $n); $i++) {
    echo str_repeat(' ', $margin);
    echo str_repeat(' ', $spaces);
    echo str_repeat('*', $stars);
    echo "\n";
    $spaces += 1;
    $stars -= 2;
}

echo trim(implode("\n", array_reverse(explode("\n", ob_get_clean()))), "\n"), "\n";

它给:

               *
              ***
             *****
            *******
           *********
          ***********
         *************
        ***************
       *               *
      ***             ***
     *****           *****
    *******         *******
   *********       *********
  ***********     ***********
 *************   *************
*************** ***************

有趣的练习不是吗... 8-)

于 2012-10-09T12:39:42.957 回答
7

你可以试试

create_pyramid("*", 5);
create_pyramid("@", 10);
create_pyramid("^_^", 10);

function create_pyramid($string, $level) {
    echo "<pre>";
    $level = $level * 2;
    for($i = 1; $i <= $level; $i ++) {
        if (!($i % 2) && $i != 1)
            continue;   
        print str_pad(str_repeat($string, $i),($level - 1) * strlen($string), " " , STR_PAD_BOTH);
        print PHP_EOL;
    }
}

输出 A

    *    
   ***   
  *****  
 ******* 
*********

输出 B

         @         
        @@@        
       @@@@@       
      @@@@@@@      
     @@@@@@@@@     
    @@@@@@@@@@@    
   @@@@@@@@@@@@@   
  @@@@@@@@@@@@@@@  
 @@@@@@@@@@@@@@@@@ 
@@@@@@@@@@@@@@@@@@@

输出 C

                        ^_^^_^^_^                        
                     ^_^^_^^_^^_^^_^                     
                  ^_^^_^^_^^_^^_^^_^^_^                  
               ^_^^_^^_^^_^^_^^_^^_^^_^^_^               
            ^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^            
         ^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^         
      ^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^      
   ^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^   
^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^
于 2012-10-09T12:38:32.180 回答
6

让它更简单:

function create_pyramid($limit) {
    for($row = 1; $row < $limit; $row ++) {
        $stars = str_repeat('*', ($row - 1) * 2 + 1);
        $space = str_repeat(' ', $limit - $row);
        echo $space . $stars . '<br/>';
    }
}
echo "<pre>" ;
create_pyramid(10);
于 2012-10-09T12:30:22.247 回答
1
<?php

$n=9;
for($i=0; $i<=$n; $i++)
{

for($j=1; $j<=$i; $j++)

                echo "&nbsp;";


    for($k=1; $k<=$n-$i; $k++)

        echo $k;


        for($j=($k-2); $j>0; $j--)

                  echo $j;





            for($k=1; $k<=$i; $k++)

                        echo "&nbsp;";






    echo "</br>";

}





?>
于 2012-10-09T12:51:01.413 回答
0
function create_row($num, $limit) {

    $append = '';

    if($limit > $num && ($limit - $i) % 2 == 0) {

        $append .= '-';

    }

    $stars = str_repeat('*', $num);

    $ap_len = floor(($limit - $num) / 2);

    $prepend = str_repeat('-', $ap_len);

    $append .= str_repeat('-', $ap_len);

    return $prepend . $stars . $append;

}

function create_pyramid($limit){

    if ($limit > 0){

        $no_last = false;

        for($i = 1; $i <= $limit; $i += 2) {

            print create_row($i, $limit) . PHP_EOL;

            if($i == $limit) {

                $no_last = true;

            }

        }

        if(!$no_last) {

            print create_row($limit, $limit) . PHP_EOL;

        }

    }

}

create_pyramid(10);
于 2012-10-09T13:13:19.017 回答
0

据我了解,您正在寻找的是一个奇数金字塔,即每行中的 * 数是按照奇数系列,如 1、3、5、7。如果您希望包含“if-else”语句,那么您可以使用上述已回答的循环,但如果您只想使用“for”循环,则可以使用以下代码:

<?php
$x=1;
  for($i=1;$i<7;$i++)
      {
      for($j=7;$j>$i;$j--)
          {
            echo '&nbsp;&nbsp;';
          }
      for($k=1;$k<=$x;$k++)
          {
            echo '*';
          }
          $x=$x+2;  
          echo "<br/>";
      }
?>
于 2014-09-01T11:58:21.500 回答
0

我认为最简单的解决方案是创建 2 个带有条件的循环:

$n = 5; // specify how many rows you want to
$stars = 0;

for ($i = $n; $i > 0; $i--) {
    for ($j = 0; $j < $i + $stars; $j++) {
        if ($j < $i - 1) {
            echo " ";
        } else {
            echo "*";
        }
    }

    $stars += 2;
    echo "\n";
}

输出将是:

    *
   ***
  *****
 *******
*********
于 2015-05-12T11:37:57.850 回答
0
<?php 
$l=5;
for ($i=1; $i <=5; $i++) { 

    for ($k=1; $k < $l ; $k++) { 

        echo '&nbsp;';

    }

    for ($j=0; $j<$i; $j++) {



        echo '*';
    }

    $l--;

    echo "<br>";

}

?>
于 2015-07-15T03:49:57.677 回答
0
function create_piramide ($filas) {    
    $n = $filas;
    echo '<pre>';
    for ($i = $filas; $i >= 0; $i--) {              
        echo str_repeat(' ', $i).str_repeat('o ', $n - $i)."\n";
    }
    echo '</pre>';
} 

create_piramide (10);
于 2015-08-19T17:57:35.153 回答
0
function pyramid($height)
{

    for ($i = 1; $i <= $height; $i++) {
        echo str_repeat("&nbsp;&nbsp;", $height - $i);
        echo str_repeat('*', $i * 2 - 1) . '<br/>';
    }

}


pyramid(5);
于 2016-08-29T22:32:47.347 回答
0

钻石形状

                   * 
                  *  * 
                *  *  * 
              *  *  *  * 
            *  *  *  *  * 
          *  *  *  *  *  * 
        *  *  *  *  *  *  * 
      *  *  *  *  *  *  *  * 
    *  *  *  *  *  *  *  *  * 
  *  *  *  *  *  *  *  *  *  * 
 *  *  *  *  *  *  *  *  *  *  * 
  *  *  *  *  *  *  *  *  *  * 
    *  *  *  *  *  *  *  *  * 
      *  *  *  *  *  *  *  * 
       *  *  *  *  *  *  * 
         *  *  *  *  *  * 
           *  *  *  *  * 
            *  *  *  * 
              *  *  * 
                *  * 
                 * 



<?php
        $num=15;
        $num2=0;
        $half = $num;
            for($i=$num2; $i<=$num; $i++)
            {       
                for($j=$half; $j>$i; $j--)
                {
                    echo "&nbsp;&nbsp;";    
                }
                for($j=$num2; $j<=$i; $j++)
                {
                    echo "&nbsp;*&nbsp;";   
                }
                echo "<br>";
            }

            for($i=$num2; $i<=$num; $i++)
            {       
                for($j=$num2; $j<=$i; $j++)
                {
                    echo "&nbsp;&nbsp;";    
                }
                for($j=$half; $j>$i; $j--)
                {
                    echo "&nbsp;*&nbsp;";
                }
                echo "<br>&nbsp;";

            }

    ?>
于 2016-12-07T06:32:52.663 回答
0
$n = 5;
for($i = $n; $i >= 1; $i--){
    for($j = 1; $j <= $i; $j++){
        if($j < $i){
            echo '0';//you can replace 0 with space
        }else{
            $num = $n - $i;
            for($k = 0; $k <= $num; $k++){
                echo '*';
            }
            for($y = 1; $y <= $n - 1; $y++){
                if($y <= $num){
                    echo '*';
                }else{
                    echo '0';//you can replace 0 with space
                    if($y == $n - 1){
                        echo '<br/>';
                    }
                }
            }
        }
    }
}
于 2018-01-23T13:50:39.273 回答
0
    $n1=10;
    $k=$n1/2;
    $n=$n1/2;

    for($i=0 ; $i<=$n1 ; $i++) {
        if($i <= $n1/2) {   
            $k=$k+1;
            $n=$n-1;    
        } else {
            $k=$k-1;
            $n=$n+1;
        }

        for($j=0 ; $j<=$n1 ; $j++) {    
            if($j < $k && $j > $n) {
                echo "*";   
            } else {
                echo "&nbsp;&nbsp";
            }
        }

        echo "<br/>";
    }
于 2020-02-25T18:46:06.493 回答
-1
<?php

ini_set('display_errors', 1);

/**
 * Here is my solution for printing the pyramid using a class 
 */

class pyramid 
{
    function __construct($rows)
    {

        for ($k=1; $k <= $rows ; $k++) { 
            $this->space($rows,$k);
            $this->left($k);
            $this->right($k);
            echo "<br>";
        }
    }


    public function left($k)
    {
        for ($i=1; $i < $k ; $i++) { 
            echo $i;
        }
    }
    public function right($i)
    {
        for ($j=$i; $j >= 1 ; $j--) { 
            echo $j;
        }
    }
    public function space($rows,$k)
    {
        for ($i=$rows-$k; $i > 0 ; $i--) { 
            echo "&nbsp;";
        }
    }
}

$pyramid =  new pyramid(5);

?>
<style type="text/css">
    body{
        font-family: monospace;
        font-size: 24px;
    }
</style>
于 2017-02-01T13:16:08.487 回答