【C语言】BC68 X形图案题解

简介: KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。

BC68 X形图案题解

问题描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。


输入:

多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。


输出:

针对每行输入,输出用“*”组成的X形图案。


e17ef08fedafb0d4d0678152e04eb9d1_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png


解题方法1:

       本题的难点是‘*’和‘空格’是随着行数变化移动的,并打印了n行。


       同时当输入n为偶数和奇数时,打印效果也不一样,当n为偶数时,打印到(n/2)行和


((n/2)+1)行为‘**’。而n为奇数时,打印到((n/2)+(n%2))行为‘*’。


       在此我们可以采用分解问题的思想,把这个大问题看成打印两个‘三角的’问题。如下


       但我们把这两个三角打印并合并起来,本问题解决了。

21b988eaab4419af563a07a3c871027f_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png



       因为是多行多列打印,所以要用来两层for循环。

for (int i = 0; i < n; i++)
{
  for (int j = 0; j < n; j++)
  {
  }
}

(1)分析右三角

因为‘*’是从左逐渐向右跑,并且每次打印‘*’时i都等于j。


所以第一个条件是if(i==j)


(2)分析左三角

这个也是比较难的,‘*’是从右向左跑,从(0,4)到(1,3)到(2,2)到(3,1)再到(4,0)


观察i和j坐标会发现(i+j=n-1)


所以第二个条件是if(i+j==n-1)


代码实现如下:

#include<stdio.h>
int main()
{
  int n = 0;
  while (scanf("%d", &n) != EOF)
  {
  int i = 0;
  int j = 0;
  for (i = 0; i < n; i++)
  {
    for (j = 0; j < n; j++)
    {
    if (i == j)
      printf("*");
    else if (i + j == n - 1)//因为行和列是从0开始的
      printf("*");
    else
      printf(" ");
    }
    printf("\n");
  }
  }
  return 0;
}

解题方法2:

       创建动态二维数组,并全部初始化为空格,然后在相应位置赋值为‘*’,之后并打印。


代码实现如下:

#include <stdio.h>
int main()
{
  int n;
  while (scanf("%d", &n) != EOF)
  {
  char** arr = (char**)malloc(n * sizeof(char*));
  int k = n - 1;
  for (int i = 0; i < n; i++)
  {
    arr[i] = (char*)malloc(n*sizeof(char));
  }
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
    {
    if ((i == j) || (j == k))
    {
      arr[i][j] = '*';
      if (j == k)
      {
      k--;
      }
    }
    else {
      arr[i][j] = ' ';
    }
    }
  }
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
    {
    printf("%c", arr[i][j]);
    }
    printf("\n");
  }
        free(arr);
  }
  return 0;
}
相关文章
|
6月前
|
C语言
c语言编程练习题:7-5 输出倒三角图案
本题要求编写程序,输出指定的由“*”组成的倒三角图案。
99 0
|
6月前
|
C语言
c语言编程练习题:7-4 输出菱形图案
本题要求编写程序,输出指定的由“A”组成的菱形图案。
77 0
|
5月前
|
C语言
【C语言刷题每日一题#牛客网BC68】——X形图案
【C语言刷题每日一题#牛客网BC68】——X形图案
|
5月前
|
C语言
【C语言刷题每日一题#牛客网BC69】——空心正方形图案
【C语言刷题每日一题#牛客网BC69】——空心正方形图案
|
5月前
|
C语言
C语言---正方形图案--循环
C语言---正方形图案--循环
|
5月前
|
C语言
C语言-----打印用“*”组成的X形图案,输出一个数表示行数
C语言-----打印用“*”组成的X形图案,输出一个数表示行数
|
11月前
|
C语言
error: expected expression C语言 X形图案打印
进行代码实现遇到的问题
98 6
|
6月前
|
C语言
c语言编程练习题:7-59 打印菱形图案
c语言编程练习题:7-59 打印菱形图案
73 0
|
Java C语言
C语言或Java-x型图案
C语言或Java-x型图案
68 0
|
C语言
C语言:打印用 * 组成的带空格直角三角形图案
思路: 总体思路: 找到规律: 行数 + 列数 < 三角形长度 - 1 打印 两个空格(题目要求带空格的三角形) 其它情况下打印 *号和空格(题目要求带空格的三角形) 使用 while循环 进行多组输入
290 0