public class exec
{
public static void main( String args[] )
{
String s=javax.swing.JOptionPane.showInputDialog("Num");
int i=Integer.parseInt(s);
for(int c=0;c<i;c++)
{
for(int d=0;d<Math.abs(c-i/2);d++)
System.out.print(" ");
for(int d=0;d<i-2*Math.abs(c-i/2);d++)
System.out.print("*");
System.out.print("\n");
}
System.exit(0);
}
}
说明:
此程序最大的难点在于设计小循环的次数,需要仔细的分析,找出规律。
以7次为例:
大循环 第一次小循环(空格) 第二次小循环(星号)
0 3 1
1 2 3
2 1 5
3 0 7
4 1 5
5 2 3
6 3 1
一般而言,象第一次小循环(打印空格)这种由大变小,再由小变大的数据变化过程可以用求一个数值的绝对值来表达,当数值从正数逐渐过渡到0,在从0逐渐过渡到负数是,它的绝对值将会产生上述情形。
所以,第一次小循环的循环次数为:Math.abs(c-i/2)
至于由小变大,再由大变小的情形与上述相反,可以断定两种情形下数值的和应该为常量,即为一个常量减去上述情形下的数值就为此时的数值。至于二倍的递增关系,可以考虑使用乘以2的方式来表达。
所以,第二次小循环的循环次数为:2*((i+1)/2-Math.abs(c-i/2))-1
化简为:i-2*Math.abs(c-i/2)
[此贴子已经被作者于2010-12-12 07:39:52编辑过]