如何在Java中打印给定的菱形图案?
基本上,我只需要正确放置空格的想法。 我的代码到目前为止如何在Java中打印给定的菱形图案?,java,loops,ascii-art,Java,Loops,Ascii Art,基本上,我只需要正确放置空格的想法。 我的代码到目前为止 *********** ***** ***** **** **** *** *** ** ** * * ** ** *** *** **** **** ***** ***** *********** 公共类金字塔3{ 公共静态void main(字符串[]args){ int i,j; int noOfCol=11; 对于(i=1;i=6){ noOfCol=noOfCol
***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
公共类金字塔3{
公共静态void main(字符串[]args){
int i,j;
int noOfCol=11;
对于(i=1;i=6){
noOfCol=noOfCol+2;
}
}
}
}
这是代码,很抱歉文档不好,希望对您有所帮助
PS:要解决任何类似的问题,只需使用一张白纸和一支铅笔,然后将列和索引“i”做成网格,然后绘制一个关系,然后就可以将其用作循环条件
公共类测试{
公共静态void main(字符串[]args){
int n=10;
//顶
对于(int i=n;i>0;i--){
//明星
对于(int j=0;j
希望能有所帮助:)这是我的解决方案,您想要的正是钻石图案
我有一个方法,它使我更容易打印
private静态void put(字符c、int n、布尔NL){
对于(inta=0;a
基本上,您可以告诉它:打印哪个字符,打印多少次,以及打印完成后是否应该添加新行
然后是实际的解决方案:
put('*',11,true);
整数计数=0;
对于(int a=5;a>=1;a--){
put('*',(int)Math.ceil(a),false);
put(“”,count++*2+1,false);
put('*',(int)Math.ceil(a),true);
}
计数=4;
对于(int a=2;a<6;a++){
put('*',(int)Math.ceil(a),false);
put(“”,计数--*2-1,假);
put('*',(int)Math.ceil(a),true);
}
put('*',11,true);
老实说,有一点蛮力逻辑,但总体思路很简单。我通过计数器变量跟踪间距,并分别打印菱形的顶部和底部
很抱歉缺少文档,因为我没有太多时间来解决这个问题。希望有帮助
由于缺乏测试,这里是输出
public class Pyramid3 {
public static void main(String[] args) {
int i, j;
int noOfCol = 11;
for (i = 1; i <= 11; i++) {
for (j = 1; j <= noOfCol; j++) {
System.out.print("*");
}
System.out.println();
if (i == 1) {
noOfCol--;
} else if (i > 1 && i < 6) {
noOfCol = noOfCol - 2;
} else if (i > 6) {
noOfCol = noOfCol + 2;
}
}
}
}
要解决有关ASCII艺术的问题,可以尝试在不同的行中查找模式。可以看到,每一行都包含一些星号(*
),一些空格(可能为零)和一些星号
因此,我们首先编写一个助手函数:
***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
第二行在中间包含一个空格,当n为奇数时,在n为偶数的情况下为2,这样看来:
System.out.println(generateRow(n,0,0));
因为na是大小减去空间数除以2
现在在每一行,空格的数量增加了两个,所以星号的数量减少了一个。如果只剩下一个星号,循环将停止。因此,您可以将其改写为:
int ns = 2-(n%2);
int na = (n-ns)/2;
System.out.println(generateRow(na,ns,na));
现在,下半部分只是通过相反的过程生产出来的。首先,我们需要撤消最后一个na
和ns
增量递减:
int ns = 2-(n%2);
int na = (n-ns)/2;
for(; na >= 1; na--, ns += 2) {
System.out.println(generateRow(na,ns,na));
}
然后我们循环直到空间数小于1:
na += 2;
ns -= 4;
将所有这些放在一起,结果是:
for(; ns > 1; na++, ns -= 2) {
System.out.println(generateRow(na,ns,na));
}
演示
对于尺寸2
、3
、5
、8
、11
和33
,这将生成:
public static void generateDiamond (int n) {
System.out.println(generateRow(n,0,0));
int ns = 2-(n%2);
int na = (n-ns)/2;
for(; na >= 1; na--, ns += 2) {
System.out.println(generateRow(na,ns,na));
}
na += 2;
ns -= 4;
for(; ns >= 1; na++, ns -= 2) {
System.out.println(generateRow(na,ns,na));
}
System.out.println(generateRow(n,0,0));
}
我喜欢简洁明了的答案。矿山利用钻石的水平和垂直对称轴:
其思想是计算钻石的1/4,然后首先围绕垂直轴镜像,然后围绕水平轴镜像(\uu
是一个空格)
首先,一个简短的实用功能用于:
下面是代码(使用Java8Lambdas打印结果和)
您可以在-n
到n
的行和列上使用两个嵌套流打印内接在正方形中的空菱形。当n>iAbs+jAbs
时获得菱形:
int n=5;
字符串[]arr=IntStream
.range关闭(-n,n)
.map(数学::abs)
.mapToObj(i->IntStream
.range关闭(-n,n)
.map(数学::abs)
//刻在正方形上的空菱形
.mapToObj(j->i+j
Arrays.stream(arr.forEach)(System.out::println);
输出:
***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
另见:
•
•我认为您需要将noOfCol分为两个变量。总列数不变,而块中的星号数不变。两者都会影响您在给定行上打印的内容。谢谢:)。。如果有人能为我提供一个链接或一些东西,让我理解这段代码的逻辑,那对我会很有帮助。提前感谢:你可能想考虑我的答案,它可能是非常有洞察力的。使用<代码>(int)数学有什么意义?CEIL(A)< /代码>?写a
(或a+1
)不是一种很奇怪的方式吗?我想我是在调试ceil(a/2+1),然后删除了它,但保留了ceil部分:/Thank you@CommuSoft:)。
**
**
***
* *
***
*****
** **
* *
** **
*****
********
*** ***
** **
* *
** **
*** ***
********
***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
*********************************
**************** ****************
*************** ***************
************** **************
************* *************
************ ************
*********** ***********
********** **********
********* *********
******** ********
******* *******
****** ******
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
****** ******
******* *******
******** ********
********* *********
********** **********
*********** ***********
************ ************
************* *************
************** **************
*************** ***************
**************** ****************
*********************************
******
*****_
****__
***___
**____
*_____
String repeat(String s, int times) {
return times == 0 ? "" : new String(new char[times]).replace("\0", s);
}
// height and width of the diamond
int size = 11;
// Mhh diamonds
List<String> l = new ArrayList<>();
// len includes the axis, too
for (int i=0, len = size/2 + 1;i<len;i++) {
String s = repeat("*", len - i) + repeat(" ", i);
//Mirror, omitting the axis itself and append
s += (new StringBuilder(s)).reverse().substring(1);
l.add(s);
}
// Print the upper part
l.forEach(System.out::println);
// mirror around the horizontal axis
Collections.reverse(l);
// Omit the horizontan axis and print the rest
l.subList(1,l.size()).forEach(System.out::println);
***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
* * * * * * * * * * *
* * * * * * * * * *
* * * * * * * *
* * * * * *
* * * *
* *
* * * *
* * * * * *
* * * * * * * *
* * * * * * * * * *
* * * * * * * * * * *