***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
基本上我只需要正确放置空间的想法。 我的代码到目前为止。
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;
}
}
}
}
答案 0 :(得分:2)
这是代码,抱歉文档不好,希望有所帮助。
PS:要解决这样的问题,只需使用白纸和铅笔,然后制作网格和索引&#39; i&#39;然后计算一个关系,然后你可以将它用作循环条件。
public class Test
{
public static void main(String[] args)
{
int n = 10;
// Top
for (int i = n; i > 0; i--)
{
// Stars
for (int j = 0; j < i; j++)
{
System.out.print("*");
}
// Spaces
for (int j = i; j < n; j++)
{
System.out.print(" ");
}
// Stars
for (int j = i; j < n; j++)
{
System.out.print(" ");
}
// Stars
for (int j = 0; j < i; j++)
{
System.out.print("*");
}
System.out.println();
}
// Bottom
for (int i = 2; i < n + 1/* Note the shift here */; i++)
{
// Stars
for (int j = 0; j < i; j++)
{
System.out.print("*");
}
// Spaces
for (int j = i; j < n; j++)
{
System.out.print(" ");
}
// Spaces
for (int j = i; j < n; j++)
{
System.out.print(" ");
}
for (int j = 0; j < i; j++)
{
System.out.print("*");
}
System.out.println();
}
}
}
希望有所帮助:)
答案 1 :(得分:2)
要解决有关ASCII艺术的问题,可以尝试在不同的行中查找模式。可以看到每行包含许多星号(*
),多个空格(可能为零)和一些星号。
所以我们先写一个辅助函数:
public static String generateRow (int n1, int n2, int n3) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < n1; i++) {
sb.append('*');
}
for(int i = 0; i < n2; i++) {
sb.append(' ');
}
for(int i = 0; i < n3; i++) {
sb.append('*');
}
}
现在我们只需计算出星号和空格的数量。第一行和最后一行只包含 n 星号,因此我们可以写:
System.out.println(generateRow(n,0,0));
第二行在 n 为奇数的情况下在中间包含一个空格,在 n 为偶数的情况下包含两个空格,所以这看起来像:
int ns = 2-(n%2);
int na = (n-ns)/2;
System.out.println(generateRow(na,ns,na));
由于 na 是大小减去空格数除以2。
现在在每一行,空格数增加了两个,因此星号的数量减少了一个。如果只剩下一个星号,则循环停止。所以你可以把它重写为:
int ns = 2-(n%2);
int na = (n-ns)/2;
for(; na >= 1; na--, ns += 2) {
System.out.println(generateRow(na,ns,na));
}
现在,下半部分只是由相反的过程产生。首先,我们需要撤消上一个na
和ns
增量减量:
na += 2;
ns -= 4;
然后我们循环直到空格数小于1:
for(; ns > 1; na++, ns -= 2) {
System.out.println(generateRow(na,ns,na));
}
将所有这些结合在一起:
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));
}
jdoodle演示。
对于尺寸2
,3
,5
,8
,11
和33
,这会产生:
**
**
***
* *
***
*****
** **
* *
** **
*****
********
*** ***
** **
* *
** **
*** ***
********
***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
*********************************
**************** ****************
*************** ***************
************** **************
************* *************
************ ************
*********** ***********
********** **********
********* *********
******** ********
******* *******
****** ******
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
****** ******
******* *******
******** ********
********* *********
********** **********
*********** ***********
************ ************
************* *************
************** **************
*************** ***************
**************** ****************
*********************************
答案 2 :(得分:0)
这是我对你想要的精确钻石图案的解决方案。
我有一个方法,这使我更容易打印。
private static void put(char c, int n, boolean NL){
for(int a = 0; a < n; a++)System.out.print(c);
if(NL)System.out.println();
}
基本上,你告诉它:要打印哪个字符,多少次,以及在完成打印后是否应该添加新行。
然后是实际的解决方案:
put('*', 11, true);
int count = 0;
for(int a = 5; a >= 1; a--){
put('*', (int)Math.ceil(a), false);
put(' ', count++ * 2 + 1, false);
put('*', (int)Math.ceil(a), true);
}
count = 4;
for(int a = 2; a < 6; a++){
put('*', (int)Math.ceil(a), false);
put(' ', count-- * 2 - 1, false);
put('*', (int)Math.ceil(a), true);
}
put('*', 11, true);
说实话,有一些暴力逻辑,但整体想法很简单。我通过计数器变量跟踪间距,并分别打印钻石的顶部和底部。
很抱歉缺少文档,因为我没有太多时间解决这个问题。希望它有所帮助!
由于缺乏测试,这是输出。
***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
答案 3 :(得分:0)
我更喜欢简洁明了的答案。我利用钻石的水平和垂直对称轴:
想法是计算钻石的1/4,然后先围绕垂直方向镜像,然后围绕水平轴(_
是一个空间)
******
*****_
****__
***___
**____
*_____
首先,repeat a character n times的简短功能:
String repeat(String s, int times) {
return times == 0 ? "" : new String(new char[times]).replace("\0", s);
}
这是代码(使用Java 8 lambdas打印结果和this answer for reversing the string)
// 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);
对于任意大小的钻石,这是8-9行代码,对于重复方法,这是3行代码。
结果:
***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
答案 4 :(得分:0)
您可以使用两个嵌套的流在从 -n
到 n
的行和列上打印一个刻在正方形中的空菱形。当 n > iAbs + jAbs
:
int n = 5;
String[] arr = IntStream
.rangeClosed(-n, n)
.map(Math::abs)
.mapToObj(i -> IntStream
.rangeClosed(-n, n)
.map(Math::abs)
// an empty rhombus inscribed in a square
.mapToObj(j -> i + j < n ? " " : "*")
.collect(Collectors.joining(" ")))
.toArray(String[]::new);
Arrays.stream(arr).forEach(System.out::println);
输出:
* * * * * * * * * * *
* * * * * * * * * *
* * * * * * * *
* * * * * *
* * * *
* *
* * * *
* * * * * *
* * * * * * * *
* * * * * * * * * *
* * * * * * * * * * *
另见:
• Drawing numeric diamond
• Empty diamond shape with numbers
答案 5 :(得分:0)
public static void main(String[] args) {
int n = 7;
for (int i = -n; i <= n; i++) {
for (int j = -n; j <= n; j++)
if (Math.abs(i) + Math.abs(j) >= n
// in chessboard order
&& (i + j) % 2 != 0
// vertical borders
|| Math.abs(j) == n)
System.out.print("*");
else
System.out.print(" ");
System.out.println();
}
}
输出:
** * * * * * **
* * * * * * * *
** * * * * **
* * * * * *
** * * **
* * * *
** **
* *
** **
* * * *
** * * **
* * * * * *
** * * * * **
* * * * * * * *
** * * * * * **