如何打印这个图案?谁能解释逻辑?

How to print this pattern? can anyone explain logic?

Star pattern

任何人都可以为这个模式制定逻辑吗? 我也尝试使用 2 个 for 循环。 我刚刚接受采访,要求我创建如图所示的星形图案。

#include <stdio.h>
int main()
{
   char f;
    int n;
    printf("Enter the number:");
    scanf("%d", &n);
    int i, j, s, k, l, m;
    for (s = 1; s <= n; s++) //printing
    {
        for (k = 1; k <= n; k++)
        {
            for (i = 1; i <= n; i++) //pattern
            {
                for (j = 1; j <= n; j++)
                {
                    if ((i + j == n + 1)) //star positions
                    {
                        printf("* ");
                    }
                    else
                    {
                        printf(" ");
                    }                
                }
                printf("\n");   //next line
            }            
        }        
    }
    return 0;
}

Java1 解决办法:

private static void stars(int n) {
    for (var i = 0; i < n; i++) {
        for (var j = 0; j < n; j++) {
            var p = " ".repeat(n-j-1) + '*' + " ".repeat(j);
            System.out.println(p.repeat(n));
        }
    }
}

或稍微优化 (?)

private static void stars(int n) {
    var p = (" ".repeat(n-1) + '*').repeat(n+1);
    var l = n*n;
    for (var i = 0; i < l; i++) {
        System.out.println(p.substring(i%n, l+i%n));
    }
}

n = 2 的输出:

 * *
* * 
 * *
* * 

n = 3

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

1 - 问题被标记为 Java

使用两个 for 循环打印此模式的 C 代码

#include<stdio.h>
int main()
{
    int n;
    printf("Enter pattern length :");
    scanf("%d",&n);
    int matrix=n*n;
    for(int i=1;i<=matrix;i++)
    {

        for(int j=1;j<=matrix;j++)
        {
           if((i+j-1)%n==0)
           {
               printf("*");
           }
           else
           {
              printf(" ");
           }
        }
        printf("\n");
    }
}

这个问题可以用2个for循环解决

#include<stdio.h>
    int main()
    {
        int num;
        printf("Enter pattern length :");
        scanf("%d",&num);
        
        int matrix=num*num;
        for(int i=0;i<matrix;i++)
        {
    
            for(int j=0;j<matrix;j++)
            {
               if((i+j+1)%num==0)
               {
                   printf("*");
               }
               else
               {
                  printf(" ");
               }
            }
            printf("\n");
        }
    }

您可以使用 printf() 在打印星号 (*) 字符时用所需的空格量填充字符串。这样,您就不必担心自己的间距问题了:

#include <stdio.h>
#include <string.h>

int main(void) {
    int n;
    printf("Enter the number: ");
    scanf("%d", &n);

    for (int i = 1; i <= n; i++) {
        char pat[n + 1];
        memset(pat, 0, sizeof pat);
        pat[0] = '*';

        for (int j = 1; j <= n; j++) {
            for (int k = 1; k <= n; k++)
                printf("%*s", n, pat);
            printf("\n");
            pat[j] = ' ';
        }
    }
}

既然可以进行一次循环,为什么还要进行两次循环?如果您观察打印的字符序列,包括换行符,您可能会看到最后一个字符 每个 n*n + 1 序列中打印的是换行符,每个 n 序列中的最后一个字符是“*”。其余为空格。

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char **argv)
{
  if (argc != 2)
    {
      fprintf(stderr, "usage: star_pattern num\n");
      exit(EXIT_FAILURE);
    }

  int n = atoi(argv[1]);
  int dim = n*n;

  for (int i = 0; i < (dim+1)*dim; i++)
  {
    if (i%(dim+1) == dim)
      fputc('\n', stdout);
    else if (i % n == n-1)
      fputc('*', stdout);
    else
      fputc(' ', stdout);
  }
}