题目: 带空格直角三角形图案
题目要求:
多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。针对每行输入,输出用“*”组成的对应长度的直角三角形,每个“*”后面有一个空格。
输入:5
输出:
*
* *
* * *
* * * *
* * * * *
先理解题意,题目中第一个要求就是多组输入,我们可以想到经常用的while循环,代码实现如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n;
while (scanf("%d", &n) != EOF)
return 0;
}
紧接着,根据题意, 直角三角形边的长度,即为等腰直角三角形。这时,我们可以联想到正方形。
假设正方形边长为5
*****
*****
*****
*****
*****
5(i)行 5(j)列反斜线就是 j = n - i - 1
反斜线以上的都需要打印空格,即 j < n - i - 1
反斜线以下的都需要打印 * ,即 j <= i
由案例得,先打印空格,再打印 * ,即可以使用for循环来实现这个代码
for (i = 0; i < n; i++)
{
for (j = 0; j < (n - i - 1); j++)
{
printf(" ");
}
for (j = 0; j <= i; j++)
{
printf("* ");
}
printf("\n");
}
易错点:题目要求打印完 * 需要空一格,因此,在 j < n - i - 1 需要空两格才会使剩下的打印 * 的时候对齐。
代码实现如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n;
int i,j;
while (scanf("%d", &n) != EOF)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < (n-i-1); j++)
{
printf(" ");
}
for (j = 0; j <= i; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
运行结果:
本题延申:
题目一:将打印部分改为如下案例
输入:5
输出:
*
* *
* * *
* * * *
* * * * *
只有打印部分和前面不同,因此我们只讲述打印部分。
同样,我们可以联想到正方形。
假设正方形边长为5
*****
*****
*****
*****
*****
5(i)行 5(j)列反斜线就是 j = n - i - 1
反斜线以上的都需要打印 * ,即 j < n - i - 1
反斜线以下的都需要打印空格,即 j <= i
由案例得,先打印 * ,再打印空格,即可以使用for循环来实现这个代码
for (i = 0; i < n; i++)
{
for (j = 0; j <= i; j++)
{
printf("* ");
}
for (j = 0; j < (n - i - 1); j++)
{
printf(" ");
}
printf("\n");
}
注意:本题案例中,每一行都会先行打印一个 * 。因此,并不需要打印两个空格来使 * 对齐,因此打印空格时一个空格或者两个空格都可以,并不会影响结果的输出。
整体代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n;
int i,j;
while (scanf("%d", &n) != EOF)
{
for (i = 0; i < n; i++)
{
for (j = 0; j <= i; j++)
{
printf("* ");
}
for (j = 0; j < (n - i - 1); j++)
{
printf(" ");
}
printf("\n");
}
}
return 0;
}
运行结果:
题目二:若需要打印等边三角形
只有打印部分和前面不同,因此我们只讲述打印部分。
我们从前面得知,由于要使后打印的 * 每一个对齐,我们需要打印两个空格。但此时,我们并不需要对齐两个 * 。因此,给一个空格即可满足题目要求。
整体代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n;
int i,j;
while (scanf("%d", &n) != EOF)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < (n - i - 1); j++)
{
printf(" ");
}
for (j = 0; j <= i; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
运行结果:
题目二是我自己在本题易错点的基础上错误得到的,可能会有更好的解法,欢迎各位朋友在评论区来给我指点迷津。