源代码:
#include <stdio.h>
int main()
{
int i, j, k,n,a;
//i控制打印的行数
//j控制打印的空格数
//k控制打印的星号数
//先打印上面的四行
printf("请输入n的值(n<=9):");
scanf("%d",&n);
for (i = 1; i <= n; i++) //控制要打印的行数
{
for (j = 1; j <=(n+1)*n/2.0-(i+1)*i/2.0; j++)//控制每行要打印的空格数
{
printf(" ");
}
if(i==1)
printf("%d",i);
else
{
for (k = 1; k <=3; k++)
{
if (k == 1 || k ==3)//只在循环的边界值打印星号,否则打印空格
for(a=1;a<=i;a++)
{
printf("%d",i);
}
else
for(a=1;a<=(i-1)*i/2.0*2-1;a++)
{
printf(" ");
}
}
}
printf("\n");
}
//然后打印下面的3行
for (i = 1; i <= n-1; i++)
{
for (j = 1; j <=(n+1)*n/2.0-(n-i+1)*(n-i)/2.0 ; j++)
{
printf(" ");
}
if(i==n-1)
printf("%d",n-i);
else
{
for (k = 1; k <= 3; k++)
{
if (k == 1 || k == 3)
for(a=n-1;a>=i;a--)
{
printf("%d",n-i);
}
else
for(a=1;a<=(n-i-1)*(n-i)/2.0*2-1;a++)
{
printf(" ");
}
}
}
printf("\n");
}
}
然后蛋黄酱在这里解释一下原理
用n=4举例叭
1、我们先把整体分成两个部分,上面四行与下面三行。
2、先写上面四行,用循环,循环四次for (i = 1; i <= n; i++),n为4是知道的。循环的四次分别代表第一行到第四行
3、我们看第一行,由许多空格和一个1组成
数一下发现有4+3+2=9个空格,也就是从1加到4(n=4,所以从1加到n)减去1个空格,第二行有4+3=7,也就是从1加到4减去1加到2——> 1+2+3+4-(1+2),减去的1加2,就是从1加到i,如下:
for (j = 1; j <=(n+1)*n/2.0-(i+1)*i/2.0; j++)//控制每行要打印的空格数
{
printf(" ");
}
这里我觉得应该讲的很清楚了叭
继续第一行,打完空格之后打1,这里我用了
if(i==1)
printf("%d",i);
目的主要是为后面服务
这样第一行就完成了
4、继续第二行,即i=2时,这个时候要打印7个空格2个2一个空格2个2,7个空格已经有了,所以只需打印2个2一个空格2个2,也就是打印三次,
if(i==1)
printf("%d",i);
else
{
for (k = 1; k <=3; k++)
//循环三次,代表打印三次,分别为22 空格 22
{
}
}
第一次和第三次打印数字,打印几个数子的话用for(a=1;a<=i;a++) { printf("%d",i); }
表示打印i个i,也就是说当i=2时表示在第二行打印2个2,中间那次打印空格,打印的个数为
for(a=1;a<=(i-1)*i/2.0*2-1;a++)
if (k == 1 || k ==3)//只在循环的边界值打印星号,否则打印空格
for(a=1;a<=i;a++)
{
printf("%d",i);
}
else
for(a=1;a<=(i-1)*i/2.0*2-1;a++)
{
printf(" ");
}
这样的循环已经能够完成上面四行了,做下面三行的时候继续使用for (i = 1; i <= n-1; i++)
打印三行就行了,只不过正好与上面相反,需要自己理解一下,因为下面三行与上面四行基本相同这里就不解释了。
最后,希望蛋黄酱的解释能给大家带来帮助,感谢大家的支持!