描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。
输入描述:
多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。
输出描述:
针对每行输入,输出用“*”组成的X形图案。
示例1
输入:
5
复制输出:
* * * * * * * * *
示例2
输入:
6
输出:
* * * * ** ** * * * *
解题思路:
这一题的难点便是找到正斜杠和反斜杠之间的规律。
我们可以将双重循环模拟遍历一个二维数组的效果,将最外层循环看为行,内层循环看为列。
(0, 0) (0, 1) (0, 2) (0, 3) (0, 4)
(1, 0) (1, 1) (1, 2) (1, 3) (1, 4)
(2, 0) (2, 1) (2, 2) (2, 3) (2, 4)
(3, 0) (3, 1) (3, 2) (3, 3) (3, 4)
(4, 0) (4, 1) (4, 2) (4, 3) (4, 4)
那么我们将题目要求在这数组中打印“ * ”号,效果如下:
* (0, 1) (0, 2) (0, 3) *
(1, 0) * (1, 2) * (1, 4)
(2, 0) (2, 1) * (2, 3) (2, 4)
(3, 0) * (3, 2) * (3, 4)
* (4, 1) (4, 2) (4, 3) *
我们对照这上面的数组表示易知,正斜边 * 所在的位置都位于 i == j的位置。
反斜边的位置我们可以通过索引行和索引列来得出:
在这个二维数组中,元素 (0,0)
的行索引为 0,列索引为 0,行索引与列索引之和为 0。而元素 (0,4)
的行索引为0,列索引为 4,行索引与列索引之和为 4。行索引与列索引之和经常在编程中用于确定对角线位置。
通过索引行和索引列我们便可以很容易得出反斜边的位置在与(i+j == 5 -1)。
答案:
#include <stdio.h>
int main()
{
int n = 0;
while (scanf_s("%d", &n) != EOF)
{
for (int i = 0; i <= n; i++) //外循环为行
{
for (int j = 0; j <= n; j++) //内循环为列
{
if (i == j || i + j == n - 1)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}