周末的时候,在宿舍又熟悉了一下各种打星星的算法,我自己总结的,发个帖子,有想看的同学,可以当作茶余饭后的消遣,回忆回忆,代码挺简单的。
——————————————————————————————————————————————————————————————
/* * 打印实心菱形:
* L0=7行 行数 星星数 空格数 星星数 空格数
* L
* * 1 1 3 L*2-1 (L0+1)/2-1
* *** 2 3 2 L*2-1 (L0+1)/2-2
* ***** 3 5 1 L*2-1 (L0+1)/2-3
* ******* 4 7 0 上下公式皆可 (L0+1)/2-4
* ***** 5 5 1 L0*2-((L*2)-1) L-(L0+1)/2
* *** 6 3 2 L0*2-((L*2)-1) L-(L0+1)/2
* * 7 1 3 L0*2-((L*2)-1) L-(L0+1)/2
*
* 主要思路:1、当行数小于等于中间行数时,打印一个正三角形。
* 2、当行数大于中间行数时,打印一个倒三角形。
*/
public class ShiXin_LingXing {
public static void main(String[] args) {
//行数必须为奇数
shiXin_LingXing(7);
}
public static void shiXin_LingXing(int L0)
{
//外层循环控制行数L
for(int L=1;L<L0+1;L++)
{
//对行数进行判断,当小于等于(L0+1)/2时,打印上部
if(L<(L0+1)/2 || L==(L0+1)/2)
{
//以下是打印正等腰三角形的方法
//内层循环1控制打印空格个数
for(int space=0;space<(L0+1)/2-L;space++)
{
System.out.print(" ");
}
//内层循环2控制打印星星个数
for(int x=0;x<(L*2-1);x++)
{
System.out.print("*");
}
System.out.println();
}
//对行数进行判断,当大于(L0+1)/2时,打印下部
if(L>(L0+1)/2)
{
//内层循环1控制打印空格个数
for(int space=0;space<(L-(L0+1)/2);space++)
{
System.out.print(" ");
}
//内层循环2控制打印星星个数
for(int x=0;x<(L0*2-(L*2-1));x++)
{
System.out.print("*");
}
System.out.println();
}
}
}
}
——————————————————————————————————————————————————————————————
/*
* 打印三角形星星:
* L0=5行 行数L 星星数 空格数 星星数 空格数
* * 1 1 4 L*2-1 L0-L
* *** 2 3 3
* ***** 3 5 2
* ******* 4 7 1
* ********* 5 9 0
* L0=5行
* ********* 1 9 0 L0*2-L-(L-1) L-1
* ******* 2 7 1 L0*2-L*2+1
* ***** 3 5 2 L0*2-L-2
* *** 4 3 3 L0*2-L-3
* * 5 1 4 L0*2-L-4
*
* 主要思路:1、寻找行数和星星数之间的规律。
* 2、寻找行数和空格数之间的规律。
* 3、用外层for循环控制整体行数,内层一个for循环控制打印的空格数。
* 4、内层另外一个for循环控制打印的星星数。
*/
public class SanJiaoXing {
public static void main(String[] args) {
//调用函数,打印正等腰三角形,行数为打印5行
sanJiaoXing1(5);
System.out.println("--------------------");
//调用函数,打印倒等腰三角形,行数为打印5行
sanJiaoXing2(5);
}
//以下是打印正等腰三角形的方法
public static void sanJiaoXing1(int L0)
{
//外层循环控制行数
for(int L=1;L<L0+1;L++)
{
//内层循环1控制打印空格个数
for(int space=0;space<L0-L;space++)
{
System.out.print(" ");
}
//内层循环2控制打印星星个数
for(int x=1;x<(L*2-1)+1;x++)
{
System.out.print("*");
}
System.out.println();
}
}
//以下是打印倒等腰三角形的方法
public static void sanJiaoXing2(int L0)
{
//外层循环控制行数
for(int L=1;L<L0+1;L++)
{
//内层循环1控制打印空格个数
for(int space=0;space<L-1;space++)
{
System.out.print(" ");
}
//内层循环2控制打印星星个数
for(int x=0;x<(L0*2-L*2+1);x++)
{
System.out.print("*");
}
System.out.println();
}
}
}
————————————————————————————————————————————————————————————
/*
* 打印空心菱形:
* 行数 空格数 星星数
* L0=7行 L (L0+1)/2-L L*2-1
* * 1 3 1
* * * 2 2 3
* * * 3 1 5
* * * 4 0 7
* * * 5 L-(L0+1)/2 L0*2-(L*2-1)
* * * 6 2 3
* * 7 3 1
* 主要思路:1、打印一个实心菱形(用到打印正三角形和倒三角形的方法)
* 2、在实心菱形的基础上,判断打印的*是否为边缘的*,如果是边缘,就打印*
* 如果不是边缘,就打印" "空格,这样就把菱形中间掏空了。
*/
public class KongXin_LingXing {
public static void main(String[] args) {
//行数必须为奇数
kongXin_LingXing(17);
}
public static void kongXin_LingXing(int L0)
{
//外层循环控制行数L
for(int L=1;L<L0+1;L++)
{
//对行数进行判断,当小于等于(L0+1)/2时,打印上部
if(L<(L0+1)/2 || L==(L0+1)/2)
{
//以下是打印正等腰三角形的方法
//内层循环1控制打印空格个数
for(int space=0;space<(L0+1)/2-L;space++)
{
System.out.print(" ");
}
//内层循环2控制打印星星个数
for(int x=0;x<(L*2-1);x++)
{
//判断是否需要打印*,当x处于第一个和最后一个位置时打印*
if(x==0 || x==(L*2-1)-1)
System.out.print("*");
//否则打印空格
else
System.out.print(" ");
}
System.out.println();
}
//对行数进行判断,当大于(L0+1)/2时,打印下部
if(L>(L0+1)/2)
{
//内层循环1控制打印空格个数
for(int space=0;space<(L-(L0+1)/2);space++)
{
System.out.print(" ");
}
//内层循环2控制打印星星个数
for(int x=0;x<(L0*2-(L*2-1));x++)
{
//判断是否需要打印*,当x处于第一个和最后一个位置时打印*
//为方便理解,这里不对公式进行简化合并处理。
if(x==0 || x==(L0*2-(L*2-1))-1)
System.out.print("*");
//否则打印空格
else
System.out.print(" ");
}
System.out.println();
}
}
}
}
————————————————————————————————————————————————————————————
/*
* 打印矩形星星:
* *****
* *****
* *****
* *****
*
* 主要思路:方法1、for循环控制整体打印*个数,并在边缘处判断是否要打印换行。
* 方法2、for循环嵌套,外层控制行数,内层控制列数。
*/
public class JuXing {
public static void main(String[] args) {
System.out.println("方法1:");
//调用方法1,传入行数和列数。
juXing1(4,5);
System.out.println("------------------------");
System.out.println("方法2:");
//调用方法2,传入行数和列数。
juXing2(4,5);
}
//num1代表行,num2代表列
public static void juXing1(int num1,int num2)
{
//num代表要打印星星的总个数
int num = num1*num2;
//for循环遍历所有num数字,之所以x从1开始,是因为不能让当x=0时,x%num2==0成立
for(int x=1; x<num+1; x++)
{
if(x%num2==0)
//打印*并换行
System.out.println("*");
else
//打印*不换行
System.out.print("*");
}
}
//num1代表行,num2代表列
public static void juXing2(int num1,int num2)
{
//外层for循环控制行数
for(int x=0;x<num1;x++)
{
//内层for循环控制列数
for(int y=0;y<num2;y++)
{
System.out.print("*");
}
//每一行打印完后,打印一个换行
System.out.println();
}
}
}
————————————————————————————————————————————————————————————
好了,这次就和大家分享这些吧,谢谢大家!
|
|