一、实心金字塔
首先,尝试写一个逐层加1个*的金字塔:
可以看出,每一层由空格和*
组成,且空格+*
的总数为底部基石的数量,那么前后空格数就是(底部基石数 - 各层星星数)*1/2
,然后拼接字符串打印空格+*+空格
即可(注意:java直接/
会取整)
然而在计算机显示中,每行列都是垂直对应,可以从上图结果看出,逐层加*
并不能保证对其,但保留奇数行可以得到一个正三角金字塔。那么跳过偶数行打印,即可得到一个正三角的金字塔:
最终代码如下:
public class Test{
public static void main(String[] args){
int starNum = 7;
System.out.println("start=" + starNum);
for(int i = 1; i <= starNum;i += 2){
String str = "";
for(int m=0;m<(starNum - i)/2;m++){
str += " ";
}
for(int n=0;n<i;n++){//can change
str += "*";
}
for(int m=0;m<(starNum - i)/2;m++){
str += " ";
}
System.out.print(str + "\n");
}
}
}
二、平均分布金字塔
星星交叉分布效果:
代码只需修改打印*
位置的循环,间隔显示*
和空格
for(int n = 0;n < i;n++){//can change
if(n % 2 == 0){
str += "*";
}else{
str += " ";
}
//或简化成三目运算
//str += n % 2 == 0 ? "*" : " ";
}
三、空心金字塔
边缘为*
,描绘一个金字塔的形状,效果如下:
同理,代码只需修改打印*
位置的循环,在输出*
的字段中,始末位置为*,其余位置为空格,且最后一行全部为*
for(int n=0;n<i;n++){//can change
if(i<starNum){
if((n==0)||(n==i-1)){
str+="*";
}else{
str+=" ";
}
//或者简化为三目运算
//str += n==0||n==i-1?"*":" ";
}else{
str+="*";
}
}
补充:
前端转后端的童鞋注意了,在java中,三目运算符不能在里面写赋值语句,这点和js不一样。比如(n > 2) ? (str = "*") : (str = "%");
,这句话前端js可以编译通过,但如果放到java里就会编译不通过,报错:不是语句。java中应当这样写:str = n > 2 ? "*" : "%"