这个问题不能算是Java的问题,只是纯粹的算法问题。 代码: public class rhombus{ public static void main(String[] args) { int len; //菱长 String outstr=new String(); //输出 int i,j,x,y; try{len=Integer.parseInt(args[0]);} catch(Exception e){len=9;}
算法讲解:先要在纸上画画方格,连出菱形来研究。 菱形是轴对称图形,于是我想到每一行要打印出来的实心点的横坐标值可以由纵轴的横坐标值与行数来确定下来。设座标原点为 0,0 设菱长为 len 则纵轴横座标也是 len 则最大横座标及总行数都是 len*2那第 i 行的第一个实心点 x 的横座标是 len-i 的绝对值 (len指纵轴横座标) 则第 i 行的第二个实心点 y 的横座标是 len+(len-x) (len同上,x指x点的横座标)循环判断第 i 行的每一个点是不是 x 或 y 点,如果是,则输出 ◆ ,否则输出汉字空格。 总行数是 len*2 ,把所有行输出来就不用我说了吧?
用取绝对值的方法: import java.util.Scanner; public class F{ public static void main(String[] args){ Scanner s = new Scanner(System.in); System.out.println ("输入一个数:"); int row = s.nextInt(); for (int i = -row; i<=row; i++){ for (int j = -row; j<=row; j++){ System.out.print ((Math.abs(i)+Math.abs(j)>row-1)?"*":" "); } System.out.println (); } } }这个你应该看的懂了吧? 如果看不懂就直接删掉输入语句 Scanner s = new Scanner(System.in); System.out.println ("输入一个数:"); 然后给row赋个值
代码:
public class rhombus{
public static void main(String[] args) {
int len; //菱长
String outstr=new String(); //输出
int i,j,x,y;
try{len=Integer.parseInt(args[0]);}
catch(Exception e){len=9;}
for(i=0;i<=len*2;i++){
for(j=0;j<=len*2;j++){
x=len-i;
x=x<0?-1*x:x;
y=len+(len-x);
outstr+=(j==x||j==y?"◆":" ");
}
outstr+="\n";
}
System.out.println(outstr);
}
}
运行结果:
E:\java>javac rhombus.javaE:\java>java rhombus
◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆
E:\java>java rhombus 3
◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆ ◆
◆
E:\java>
菱形是轴对称图形,于是我想到每一行要打印出来的实心点的横坐标值可以由纵轴的横坐标值与行数来确定下来。设座标原点为 0,0
设菱长为 len
则纵轴横座标也是 len
则最大横座标及总行数都是 len*2那第 i 行的第一个实心点 x 的横座标是 len-i 的绝对值 (len指纵轴横座标)
则第 i 行的第二个实心点 y 的横座标是 len+(len-x) (len同上,x指x点的横座标)循环判断第 i 行的每一个点是不是 x 或 y 点,如果是,则输出 ◆ ,否则输出汉字空格。
总行数是 len*2 ,把所有行输出来就不用我说了吧?
nanyang9(奋斗…) 太谢谢你了!以后还要多多向你请教啊。
nanyang9(奋斗…) 你写的还有些看不懂啊,有些关键字还没有接触过。
算法真巧!
to: lz
nanyang9(奋斗…) 回答得那么棒、多仔细,除了源代码,连算法说明都给了,可以人家给分了。好不平哦!
public static void main(String[] args) {
System.out.println( ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println(◆ ◆);
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ ◆ );
System.out.println( ◆ );
}
}
你说"有些关键字还没有接触过"是指的下面这块吧:
try{len=Integer.parseInt(args[0]);}
catch(Exception e){len=9;}
意思是尝试着接收从命令行接收第一个参数,如果接收到了就转化为整型并赋值给len,
如果这个尝试失败(如命令行没有传参数过来,或参数不可以转变成整型),则赋自定义的默认值9给len
import java.util.Scanner;
public class F{
public static void main(String[] args){
Scanner s = new Scanner(System.in);
System.out.println ("输入一个数:");
int row = s.nextInt();
for (int i = -row; i<=row; i++){
for (int j = -row; j<=row; j++){
System.out.print ((Math.abs(i)+Math.abs(j)>row-1)?"*":" ");
}
System.out.println ();
}
}
}这个你应该看的懂了吧?
如果看不懂就直接删掉输入语句
Scanner s = new Scanner(System.in);
System.out.println ("输入一个数:");
然后给row赋个值