打印菱形总结
常见菱形
打印菱形问题中菱形都是对称的,上下左右(有时候会去掉某一部分),一些做法是先打印上半部分再打印下半部分,这样容易理解,但是代码会重复冗长,我们可以把对称作为突破点简化代码。
以下总结常见菱形:
- 普通菱形
- 空心菱形
- 挖空菱形
- 数字菱形
总结一个模板:(后面只截取核心部分)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j,k;
int n;
scanf("%d",&n); //打印n行菱形
n=(n-1)/2; //利用对称(要结合题目要求)
for (i=-n;i<=n;i++) //打印行
{
for(j=-n;j<=n;j++) //打印列
{
k=abs(i)+abs(j);
if () //核心部分
printf("*"); //有时候是数字
else
printf(" ");
}
printf("\n"); //打印完一行后记得换行
}
return 0;
}
核心部分:分析打印“*”与空格时k值的规律
1.普通菱形

n=(n-1)/2;
for (i=-n;i<=n;i++)
{
for(j=-n;j<=n;j++)
{
k=abs(i)+abs(j);
if (k<=n)
printf("*");
else
printf(" ");
}
printf("\n");
}
下面制作一个表格来分析核心部分k的条件,在平时的测试中可以采用小的数来测试。

2.空心菱形

n=(n-1)/2;
for (i=-n;i<=n;i++)
{
for(j=-n;j<=n;j++)
{
k=abs(i)+abs(j);
if (k==n)
printf("*");
else
printf(" ");
}
printf("\n");
}
3.挖空菱形

n=(n-1)/2;
for (i=-n;i<=n;i++)
{
for(j=-n;j<=n;j++)
{
k=abs(i)+abs(j);
if (k>=n)
printf("*");
else
printf(" ");
}
printf("\n");
}
4.数字菱形

n=(n-1)/2;
for (i=-n;i<=n;i++)
{
for(j=-n;j<=n;j++)
{
k=abs(i)+abs(j);
if (k<=n)
printf("%d",n-k+1);
else
printf(" ");
}
printf("\n");
}
PS:要分析数字菱形打印出的数字与n,k的关系
菱形问题变形
1.打印三角
- 侧三角

n=(n-1)/2;
for (i=-n;i<=n;i++)
{
for(j=-n;j<=0;j++)
{
k=abs(i)+abs(j);
if (k<=n)
printf("*");
else
printf(" ");
}
printf("\n");
}
- 正三角

n=(n-1)/2;
for (i=-n;i<=0;i++)
{
for(j=-n;j<=n;j++)
{
k=abs(i)+abs(j);
if (k<=n)
printf("*");
else
printf(" ");
}
printf("\n");
}
2.特殊数字菱形
- 打印的数字对称

n=(n-1)/2;
for (i=-n;i<=n;i++)
{
for(j=-n;j<=n;j++)
{
k=abs(i)+abs(j);
if (k<=n)
printf("%d",k+1);
else
printf(" ");
}
printf("\n");
}
- 打印的数字不对称(将菱形分成两半)

int i,j,k;
int n;
scanf("%d",&n); //此时输入的n对应最长行
for (i=1;i<=n;i++)
{
for(j=1;j<=n-i;j++)
{
printf(" ");
}
for(k=1;k<=2*i-1;k++)
{
printf("%d",i);
}
printf("\n");
}
for (i=n-1;i>0;i--)
{
for(j=1;j<=n-i;j++)
{
printf(" ");
}
for(k=1;k<=2*i-1;k++)
{
printf("%d",i);
}
printf("\n");
}
909

被折叠的 条评论
为什么被折叠?



