从数学到编程步骤练习(java)

问题:打印一个菱形,要求空心;

数学模型:相关的要素: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");
	 }
   
   }
 }
}

从数学到编程,往后遇见问题,先去数学角度探明真相,然后再翻译成机器语言,道路就通了,不用在代码里来回调,微调一下就行了,这个思想方法真的好,标记一下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值