【问题标题】:Print a pattern to display numbers up to 5 rows and 5 columns like 5 4 3 2 1 and in next line 4 3 2 1 5 till 5th row打印图案以显示最多 5 行和 5 列的数字,例如 5 4 3 2 1 和下一行 4 3 2 1 5 到第 5 行
【发布时间】:2014-12-08 18:24:51
【问题描述】:

这是一个方形图案,每行有 5 列,共有 5 行,图案如下所示:

      5 4 3 2 1
      4 3 2 1 5
      3 2 1 5 4
      2 1 5 4 3
      1 5 4 3 2

我的代码如下获取模式,但是当计数器变为 1 并显示在相应的列值中时,我无法重置每个值。

谁能指导我哪里缺乏逻辑?

<?php
  $n=5;
  $count=5;
  for($i=5;$i>=1;$i--){ 
     for($j=$count;$j>=1;$j--)
     {
        if($count>=1)
           echo $j."&nbsp;";        
     }
     $count--;
     echo "\n";
  }
?>

【问题讨论】:

  • 这个问题有很多解决方案。但我认为我的(使用模数)是最简单的,也是最快的。寻找那种解决方案总是非常重要的;)。向所有回答者致以最诚挚的问候,祝您有美好的一天!

标签: php for-loop


【解决方案1】:
$n=5;
for($i=$n;$i>=1;$i--)
{
  for($j=$i;$j>=1;$j--)
  {
    echo "$j";
  }
  if($i<$n)
  {
    for($k=$n;$k>$i;$k--)
    {
      echo "$k";
    }
  }
  echo"<br>";
}

【讨论】:

    【解决方案2】:
    for ($i=0;$i<=33;$i++){
        echo"<br>".$i;
        for ($j = 0; $j < $i; $j++) {
            echo $j;
        }    
        }
    

    【讨论】:

      【解决方案3】:

      试试这个

      $n=5;
      $arr = array();
      for($j=$n;$j >0;$j--)
      {
      for($k = $n;$k>0;$k--)
      {
          echo $k. " ";
      }
      echo implode(" ",$arr);
      array_push($arr,$n);
      echo '<br/>';
      $n--;   
      }
      

      【讨论】:

        【解决方案4】:

        第一步:感叹 PHP 没有可以实际以 C 语言速度运行的内置 array_rotate。

        第二步:使用来自 PHP 站点上的 cmets 的 array_rotate 版本,该版本将在紧要关头提供服务。 (如果在大型数组上使用 array_shift,这个版本可能会很糟糕,但在我们的例子中是 meh)

        function array_rotate(&$arr) {
          $elm = array_shift($arr);
          array_push($arr, $elm);
          return $elm; // return the moved element value
        }
        

        第三步:

        $a = [ 5, 4, 3, 2, 1 ];
        for ($i=0; $i<5; $i++) {
          echo join(' ',$a) . PHP_EOL;
          array_rotate($a);
        }
        

        第四步:???

        第五步:盈利!

        【讨论】:

          【解决方案5】:

          $str = '54321';

          回显 $str."\n";

          for($i=1;$i

          $a=$str[0];
          
          
          $var = substr($str,1);
          
          
          echo $str=$var.$a;
          
          
          echo "\n";
          

          }

          如果你不想使用 substr 函数,那么试试这个

            $str = '54321';
            $len = strlen($str);
          
            $s= '';
            for ($i=0;$i<$len;$i++){  
                    print_r($str);
                    print_r($s);
                    $s = $s.$str[$i];
                    $str[$i] = '';  
                    echo '<br>';
            }
          

          【讨论】:

            【解决方案6】:

            如果我们更改您的设置:

              5 4 3 2 1
              4 3 2 1 5
              3 2 1 5 4
              2 1 5 4 3
              1 5 4 3 2
            

              4 3 2 1 0
              3 2 1 0 4
              2 1 0 4 3
              1 0 4 3 2
              0 4 3 2 1
            

            它看起来更像(某个数字 MOD 5)...所以您的循环可以简单地打印 (N % 5)+1

            那么 N 是什么?

            而不是将 i 和 j 视为递减。也许我们可以将它们视为从某个数字中增加和减去。

            假设 i 从 0-4 开始,j 从 0-4 开始。 (记得看第二个块,因为 +1 发生在我们要做的 MODULUS 操作之后。

            假设我们想要将 i 和 j 相加并从某个数字中取出它们,最初 4 可能看起来不错,因为 4-(0+0) 给了我们正确的第一个单元格,但是一旦我们到达末尾第二行我们将做 4-(1+4) 并且负数会导致模数问题。 (数学和编程语言的解释往往不同。

            9 mod 5 也是 4,我们永远不会减去超过 8(当 i 和 j 都是 4 时),所以 9 似乎是更好的选择。

            PSEUDOCODE
            
            for i from 0 to 4
              for j from 0 to 4
                print ( ( 9-(i+j) ) % 5 ) + 1
                if j<4 print " "
              loop
              print newline
            loop
            

            要使循环对 5 以外的尺寸灵活:

            PSEUDOCODE
            
            for i from 0 to SIZE-1
              for j from 0 to SIZE-1
                print ( ( ( (2*SIZE)-1) - (i+j) ) % SIZE ) + 1
                if j<SIZE-1 print " "
              loop
              print newline
            loop
            

            【讨论】:

            • 添加了对“使用模数”的一种方法的解释
            • 非常好的答案。我不敢相信人们在这里“写”什么。这是一个简单的单行练习,而在某些答案中存在多维 fors、ifs 和 whiles...:)。
            • 谢谢 - 我喜欢把我的推理放在这样的问题上。教一个人钓鱼 - 一些东西......哦,是的,他会整天坐在船上喝啤酒。 :-)
            • 是的。但我仍然印象深刻。在这种情况下,对于 n
            • 如果行数/列数是可变的(假设它应该是),我的也需要一些调整。基本上,我的幻数(4、4、9和5)需要根据正方形大小来确定……4s应该是SIZE-1,5应该是SIZE,9应该是(SIZE* 2)-1,我想。来晚了。
            【解决方案7】:

            我将尝试解释您可以在哪些方面改进上述代码的逻辑。您需要 5 行和 5 列值,即该模式中的 25 个值。你最外面的 for 循环运行 5 次,占了 5 行有效。

            但是内部的for 循环即:

            $count = 5; //initially and gets reduced by 1 on every iteration
            for($j=$count;$j>=1;$j--)
             {
                if($count>=1)
                   echo $j."&nbsp;";
            
             }
            

            上面的代码应该会产生以下输出,因为您将在$j 命中 1 时终止循环:

               5 4 3 2 1
               4 3 2 1
               3 2 1 
               2 1 
               1
            

            我希望你明白为什么你会得到这个输出。这是因为您没有处理输出的后半部分。因此,如果您要扩展您的逻辑,请将输出视为两部分(对于每一行):

            1. 从 5 开始的数字列表,即您设置的 $counter 变量会发生变化但在 1 处终止。
            2. 另一个总是从 5 开始的数字列表,它将占后半部分,从而产生预期的输出:

                //1st half    //2nd half
                5 4 3 2 1
                4 3 2 1       5
                3 2 1         5 4
                2 1           5 4 3
                1             5 4 3 2   
              

            因此,只需在现有的 for 循环之后添加另一个 for/while 循环就可以了。你可能想尝试这样的事情:

             $n=5;
            
            
             for($i=5;$i>=1;$i--){
               $count=5 - $i;
               $k = 5;
            
               //Takes care of the firs half
                for($j=$i;$j>=1;$j--) //because $i gets decreased every time any way
                {
                   if($i>=1)
                   echo $j."&nbsp;";
            
                }
            
               //Takes care of the second half
                 while($count > 0){
                   echo $k."&nbsp;";
                   $k--;
                 }
              echo "\n";
              }
            

            【讨论】:

            • 如果有人解释为什么答案被否决,我将不胜感激。
            【解决方案8】:

            其实问题很简单,OP 大部分都是正确的。 他的内部循环中的条件只需要重新设计,并且需要一个 if 条件来在输出中添加 '5' 以防止在数字滑入负范围时溢出

            <?php
              $n=5;
              $count=0;
            
              for($i=5; $i>=1; $i--){
            
                 // You still want to loop through here 5 times, because you need to print out 5 numbers
                 for($j=5; $j>=1; $j--)
                 {
                    // The fun part is augmenting your output so the numbers don't ever slip below 0 or negative.
                    // This is already partially achieved in the fact that the range of your values is 5.
                    // So if the value slips below the desired threshold, incrementing it by your range will bring it back into desired range
                    $out = $j - $count;
                    if ($out <= 0) {
                      $out += 5;
                    }
                    echo $out."&nbsp;";
                 }
                 $count++;
            
                 echo "\n";
              }
            ?>
            

            【讨论】:

            • 这只是模拟模运算:)。工作,但复杂......
            • 对他来说,向老师解释比解释他是如何在一夜之间学会模数算术更容易:)
            【解决方案9】:

            我认为这是一个学习练习,所以必须用for循环来完成。

            <?php
            $n=5;
            for($i=$n; $i>=1; $i--) { 
                for($j=$n; $j>=1; $j--) {
                    echo ($i + $j - 1) % $n + 1; 
                    echo ' '; // cosmetics :)       
                }
                echo "\n";
            }
            ?>
            

            % 是一个模运算符。 6 % 5 = 6 除以 5 = 1 的余数。

            示例:1%5 = 1; 5%5 = 0; 12%5 = 2。


            这是模运算的简单练习 (http://en.wikipedia.org/wiki/Modular_arithmetic)。每个新行只不过是一个简单的加法运算,而是在 5-mod 数字集中(对于从较小数字开始的每一行)。我认为这是解决这个问题的最好的单线解决方案。另外操作简单,不费时。

            最好的问候!

            【讨论】:

            • 你忘了回显空格。但除此之外,很好的答案
            • 谢谢。这是我能想到的最好的答案。但是,在您的回答中,有一个很好的问题描述。来自我的+1,即使使用其他语言的伪代码;)。 BR!
            • 我可以添加“实际”的 php 代码,但我会做他们所有的工作 ;)
            【解决方案10】:

            你可以试试这个:

            $str = "5 4 3 2 1";
            $arr_str = explode(' ', $str);
            $imax_loop = count( $arr_str);
            for($i = 0; $i < $imax_loop; $i++)
            {
                echo implode(" ",$arr_str) . "\n";
            
                // Get the first element and pop it off
                $head_elm = array_shift($arr_str);
                // append the first element at the end of the array
                array_push( $arr_str, $head_elm);
            }
            

            输出

            5 4 3 2 1
            4 3 2 1 5
            3 2 1 5 4
            2 1 5 4 3
            1 5 4 3 2
            

            【讨论】:

              【解决方案11】:

              稍微修改了你的代码:

              <?php
                $limit=5;
                $count=5;
                for($i=5;$i>=1;$i--){ 
                   for($j=$limit;$j>=1;$j--)
                   {
                       $count = ($count>=1)?$count:5;  
                       echo $count--."&nbsp;";        
                   }
                    if($count<1)
                      $count=$i-1;
                    else
                        $count--;
                   echo "<br>";
                }
              ?>
              

              DEMO

              输出:

              5 4 3 2 1 
              4 3 2 1 5 
              3 2 1 5 4 
              2 1 5 4 3 
              1 5 4 3 2 
              

              【讨论】:

              • 我没有反对它,但我知道为什么有人这样做。使用多行 ifs 和 whiles 就像在这里用大炮向鸟射击。这是一个简单的单线解决方案练习。并非每个可行的解决方案都是好的。情况并非如此。如果这是 NASA 的太空船练习,您只需损失 10.000 美元就可以在船上增加一些内存;)。
              【解决方案12】:

              如果你用你的第一行创建一个数组,那么你可以array_shift()第一个元素和array_push()

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-05-30
                • 2022-06-26
                • 2014-04-27
                • 1970-01-01
                • 2017-04-07
                相关资源
                最近更新 更多