浓缩版,供参考:
#include<stdio.h>
int main()
{
int i,j,l,m,pos,n;
char k;
scanf("%d",&n);
for(pos=l=0, m=n-1; m>=0; ++l<n?pos=l:pos=--m)
for(i=pos,j=0;j<=2*pos+1;i<n?i++:j++)
printf("%c",i<n?' ':(j<=pos)?(k=j+1+'0'):((--k)!='0'?k:'\n'));
return 0;
}
普通写法:
#include<stdio.h>
int main()
{
int i,j,n=4,k;
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
printf(" ");
for(j=0,k=0;j<2*i+1;j++)
printf("%d",j <= i ? ++k : --k);
printf("\n");
}
for(i=n-2;i>=0;i--)
{
for(j=i;j<n;j++)
printf(" ");
for(j=0,k=0;j<2*i+1;j++)
printf("%d",j <= i ? ++k : --k);
printf("\n");
}
return 0;
}
#include<stdio.h>
int main()
{
int n,i,j;
while((scanf("%d",&n))!=EOF)
{
for(i=1;i<2*n;i++)//i为第i行答案
{
int a=0;//每次都要将a初始化
if(i<=n)//开始分增大与缩小
{
for(j=1;j<=n+i-1;j++)//这个j是关键,每一行的长度为n+i-1;
{
if(j<=n-i)//前n-i的值都为空格
{
printf(" ");
}
if(j>n-i)//自第三个数开始从1逐渐增加直到第n个数然后自n+1个数开始减小
{
if(j<=n)//在第n个数之前的值是增加的
{
a++;//一定是先将a值增加再输出
if(j==n+i-1)//为了让第一个1也能有换行符所以这么搞
{
printf("%d\n",a);
}
else printf("%d",a);
}
else//第n+1个值开始增加,先将a减小,再输出
{
a--;
if(a>1)
{
printf("%d",a);
}
else//直到通过a判断,当a==1时说明减到底了,直接break即可
{
printf("%d\n",a);
break;
}
}
}
}
}
else //当i>n时
{
for(j=1;j<=3*n-i-1;j++)//让j从最大的n-1开始减小到1;
{
if(j<=i-n)//前i-n的值都为空格
{
printf(" ");
}
if(j>i-n)//自第i-n个数开始从1逐渐增加直到第n个数然后自n+1个数开始减小
{
if(j<=n)//在第n个数之前的值是增加的
{
a++;//一定是先将a值增加再输出
if(j==3*n-i-1)//为了让第一个1也能有换行符所以这么搞
{
printf("%d\n",a);
}
else printf("%d",a);
}
else//第n+1个值开始减小,先将a减小,再输出
{
a--;
if(a>1)
{
printf("%d",a);
}
else//直到通过a判断,当a==1时说明减到底了,直接break即可
{
printf("%d\n",a);
break;
}
}
}
}
}
}
}
return 0;
}