如果打印一个上半部分7行的效果如图:
上半部分:
第一行 6个空格
第二行 5个空格
..........
第七行 0个空格
所以 空格依次减1,可以写成 空格数=n-i
打印星号就非常简单了,每行1 3 5 7 9 ...奇数递增
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
// 上半部分
for (int i = 1; i <= n; i++) {
// 打印空格
for (int j = 0; j < n - i; j++) {
printf(" ");
}
// 打印*
for (int j = 0; j < 2 * i - 1; j++) {
printf("*");
}
// 换行
printf("\n");
}
//下半部分在下面
return 0;
}
下半部分 :
还是拿上半部分七行的菱形举例,那下半部分只有6行
每行星号依次为 11 9 7 5 3 1
11=2*6-1 9=2*6-3 7=2*6-5 .......
如果下半部分写循环的话,定义一个变量i
可以看出i=1 11=2*(7-1)-i
i=2 9=2*(7-1)-(2*i)+1
i=3 7=2*(7-1)-(2*i)+1
i=4 5=2*(7-1)-(2*i)+1
于是可以把第一个改成 i=1 11=2*(7-1)-(2*i)+1
所以规律是 星号数量 = 2*(n-1-i)+1
代码实现:
// 下半部分
for (int i = 1; i <= n - 1; i++) {
// 打印空格
for (int j = 0; j < i; j++) {
printf(" ");
}
// 打印*
for (int j = 0; j < 2*(n-1-i)+1; j++) {
printf("*");
}
// 换行
printf("\n");
}
补充
其实还有一个办法:
11很容易想到2*6-1 第一行7-1=6
9很容易想到2*5-1 第二行7-2=5
7很容易想到2*4-1 第三行7-3=4
刚好行数变量 i 每次增加1
所以 星号数量 = 2*(n-i)-1
// 下半部分
for (int i = 1; i <= n - 1; i++) {
// 打印空格
for (int j = 0; j < i; j++) {
printf(" ");
}
// 打印*
for (int j = 0; j < 2*(n-i)-1; j++) {
printf("*");
}
// 换行
printf("\n");
}
完整代码演示: