给定一个数字N:表示最多能利用的*的数量,用*号打印菱形,菱形的总*数量不超过给定数字N
要求:
1.最大化利用*
2.展示剩余的*数量举例:
N=1,打印菱形:
*
剩余*:0
N=10,打印菱形:
*
***
*
剩余*:5
N=14,打印菱形:
*
***
*****
***
*
剩余*:1
因常规方法太复杂且测试有问题,故不记录,下面是自己写的天才写法
分析:画菱形所需*数规律:1 5 13 25 41...
这里我进行过数学分析,然后算出通项公式,但实际不需要这么麻烦
考虑行数H与菱形所需星数M的关系,H-M
1-1 3-5 5-13 7-25 9-41...4 8 12 16 20 这是每增加2行对应增加的星星数,发现=2*H+2
int H=1; //行数
int M=1; //构造菱形所需星数,这里初始化为第1行需要1颗星星,暂不考虑N=0情况
int result=0; //存放剩余星星数量,即N-M
输入N,while((N-M)>=(2*H+2)){M=M+2*H+2; H=H+2;}result = N-M;那么算好了N,H,M怎么用星星画菱形呢,传统方法时画空格+画星星,因菱形的形状,只能拆分成上下两个部分,此时至少要四个for循环还要算各个循环i,j各种式子,巨麻烦
从数学角度出发,什么式子可以表示菱形呢,回忆以前学数学时,|x| +|y| <=|K| k为常数,就可以在坐标轴画出来菱形,注意此时x,y对应的取值,综合代码如下:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
int H=1; //行数
int M=1; //行数对应的所需星数
int result=0; //N-M
Scanner sc = new Scanner(System.in);
System.out.print("请输入N以打印最大形状的菱形:");
int N = sc.nextInt();
if (N == 0) return; //如果N=0直接退出
System.out.println("N="+N+",打印菱形:");
while((N-M)>=(2*H+2)){
M=M+2*H+2;
H=H+2;
}
result = N-M;
int m = (H-1)/2;
for(int i = -m;i <= m;i++){
for(int j = -m;j <= m;j++){
if(Math.abs(j)+Math.abs(i)<=Math.abs(m)){ //当<=改为==是空心菱形
System.out.print("*");
}
else{
System.out.print(" ");
}
}
System.out.println();
}
System.out.println("剩余*:"+result); //可以取消result 直接N-M
}
}
以上代码经过多次验证,可以放心食用,谢谢