问题:打印一个菱形,要求空心;
数学模型:相关的要素:1,行变化,空格变化,星号变化,左边界偏移量,中间数,统一变化数,
设有正整数集合N,x为N的集合的元素,则行变化一定为一个递增差为1的递增数列,空格变化则应该为一个递减差为1的递减数列,* 的变化为一个 2n-1 的等差数列,中间数为 n/2 的向上取整数值为W,设定统一变化数为x,左边界偏移量设定为m,其实m的值等于W+1,下三角偏移初始值为 t,一共有 n 行。
1 初始 若打印上面的三角形
则行变化 f(x)=x
空格变化:f(x)=m-x
* 号变化:f(x)=2x-1
2 演进(若打印下面的三角形(倒立))
则行变化: f(x)=x
空格变化:发生裂变;
(1) :当x<W 则 f(x)=|m-x|+t ( 注意 f(x)>=0 )
(2):当x>=W 则 f(x)=m-x
*号变化: 发生裂变;
(1): 当x>=W 则 f(x)=2x-1
当为 1 或者 最大值 为真,其他为假
(2): 当x<W 则 f(x)=2n+1-2x
当为1 或者 最大值 为真,其他为假
(求得 t=3)
翻译成代码:
public class lingxing
{
public static void main(String[] args)
{
int n=17; //设定行数
int m=(int)Math.ceil(n/2+1)+1; //左边界偏移初始值,为中间数加1
System.out.print(Math.ceil(n/2+1)); //打印中间数
System.out.printf("\n");
for(int x=1;x<=n;x++) //用x作为统一的驱动变量,递增差为1
{if(x<=Math.ceil(n/2+1)) //判断在中间数前面还是后面
{
for(int j=m-x;j>=0;j--) //空格变化为递减差为1的递减
{System.out.print(" ");}
for(int k=1;k<=(2*x-1);k++) // *的变化为 2x-1 的等差数列
{if(k==1|k==2*x-1) // 判断是否为极值,为真则打印 * ,为假则打印 空格
System.out.print("*");
else
System.out.print(" ");
}
System.out.printf("\n");
}
else if(x>Math.ceil(n/2+1)) //中间数之后的处理
{
for(int p=1;p<=Math.abs(m-x)+3;p++) //空格变为递增数列 初始值为3
{System.out.print(" ");}
for(int l=2*n+1-2*x;l>0;--l) // *变为了递减数列,公式为 2n+1-2x
{ if(l==1|l==2*n+1-2*x) //判断极值是否出现,同上
System.out.print("*");
else
System.out.print(" ");
}
System.out.printf("\n");
}
}
}
}
从数学到编程,往后遇见问题,先去数学角度探明真相,然后再翻译成机器语言,道路就通了,不用在代码里来回调,微调一下就行了,这个思想方法真的好,标记一下。