Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的金字塔模式_Java_For Loop - Fatal编程技术网

Java中的金字塔模式

Java中的金字塔模式,java,for-loop,Java,For Loop,在这个高级网站上问这样一个新手问题太难了。但是经过这么多的尝试,甚至失去了希望,我不得不把自己带到这里来。我无法打印以下图案: 1 1 2 1

在这个高级网站上问这样一个新手问题太难了。但是经过这么多的尝试,甚至失去了希望,我不得不把自己带到这里来。我无法打印以下图案:

                    1                                                                                                                              
                1   2   1   
            1   2   4   2   1   
        1   2   4   8   4   2   1   
    1   2   4   8   16  8   4   2   1
1   2   4   8   16  32  16  8   4   2   1
但通过我令人厌倦的努力,我达到了以下目标:

public static void main(String[] args) {
    int num = 1;
    for (int i = 0; i < 15; i++) {
        for (int j = 0; j < 15 - i; j++) {
            System.out.print(" ");
        }
        for (int k = 0; k <= i; k++) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}


           1 
          1 1 
         1 1 1 
        1 1 1 1 
       1 1 1 1 1 
      1 1 1 1 1 1 
     1 1 1 1 1 1 1 
    1 1 1 1 1 1 1 1 
   1 1 1 1 1 1 1 1 1 
  1 1 1 1 1 1 1 1 1 1 
 1 1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 1 1 
给你

public static void main(String[] args) {
    int max = 6;
    int padLength = (int) Math.ceil(Math.log10(Math.pow(2, max) + 1)) + 2;
    for (int i = 0; i < max; i++) {
        for (int j = 1; j < max - i; j++) {
            System.out.print(pad(" ", padLength));
        }
        for (int k = 0; k <= i; k++) {
            System.out.print(pad(Math.pow(2, k), padLength));
        }
        for (int k = i - 1; k >= 0; k--) {
            System.out.print(pad(Math.pow(2, k), padLength));
        }
        System.out.println();
    }
}

public static String pad(double d, int l) {
    Integer i = (int) d;
    return pad(i.toString(), l);
}

public static String pad(String s, int l) {
    return String.format("%-" + l + "s", s);
}
解释 int padLength=int Math.ceilMath.log10Math.pow2,最大值+1+2; Math.pow2,max-给出我必须显示的最大数字

Math.ceilMath.log10number+1-我使用它来确定表示特定数字的字符串的长度。当数字是10的精确幂时,我添加1以跳过边缘情况,例如log1010->1这在问题中指定的任务中永远不会发生,这只是为了溶液的纯度。Ceil只是把数字四舍五入

+2-指定了两个数字之间的最小间距示例为2个空格长,所以我只添加了这个

您可以在这里使用Integer.tostringitmath.pow2,max.length+2,但它没有那么漂亮:

返回字符串。格式%-+l+s,s; 首先,我构建的格式字符串看起来像%-3s,这意味着打印字符串的最小长度为3,在右边填充。第二个参数是我要打印的字符串。指

给你

public static void main(String[] args) {
    int max = 6;
    int padLength = (int) Math.ceil(Math.log10(Math.pow(2, max) + 1)) + 2;
    for (int i = 0; i < max; i++) {
        for (int j = 1; j < max - i; j++) {
            System.out.print(pad(" ", padLength));
        }
        for (int k = 0; k <= i; k++) {
            System.out.print(pad(Math.pow(2, k), padLength));
        }
        for (int k = i - 1; k >= 0; k--) {
            System.out.print(pad(Math.pow(2, k), padLength));
        }
        System.out.println();
    }
}

public static String pad(double d, int l) {
    Integer i = (int) d;
    return pad(i.toString(), l);
}

public static String pad(String s, int l) {
    return String.format("%-" + l + "s", s);
}
解释 int padLength=int Math.ceilMath.log10Math.pow2,最大值+1+2; Math.pow2,max-给出我必须显示的最大数字

Math.ceilMath.log10number+1-我使用它来确定表示特定数字的字符串的长度。当数字是10的精确幂时,我添加1以跳过边缘情况,例如log1010->1这在问题中指定的任务中永远不会发生,这只是为了溶液的纯度。Ceil只是把数字四舍五入

+2-指定了两个数字之间的最小间距示例为2个空格长,所以我只添加了这个

您可以在这里使用Integer.tostringitmath.pow2,max.length+2,但它没有那么漂亮:

返回字符串。格式%-+l+s,s; 首先,我构建的格式字符串看起来像%-3s,这意味着打印字符串的最小长度为3,在右边填充。第二个参数是我要打印的字符串。指


我发现另一个答案非常压倒性和戏剧性。你不需要太多的数学和复杂性来解决这个问题。这可能不是最好的代码,但我认为它很容易理解。甚至不需要解释,这是一种逐行的方法,最好保持简单

public static void main(String[] args) {

    // Init
    int row = 0;
    int maxRows = 6;
    int num = 1;
    int indent = maxRows - 1;

    // Printing loop
    while (row < maxRows) {

        // Indent
        for (int i = 0; i < indent; ++i) 
            System.out.print("    ");

        // Print nums
        for (int i = 0; i < num; ++i) 
            System.out.printf("%4d", (int) Math.pow(2.0, i));
        for (int i = num - 2; i >= 0; --i)
            System.out.printf("%4d", (int) Math.pow(2.0, i));

        // New line
        System.out.println(""); 

        // Adjustments
        ++row;
        --indent;
        ++num;
    }

我发现另一个答案非常压倒性和戏剧性。你不需要太多的数学和复杂性来解决这个问题。这可能不是最好的代码,但我认为它很容易理解。甚至不需要解释,这是一种逐行的方法,最好保持简单

public static void main(String[] args) {

    // Init
    int row = 0;
    int maxRows = 6;
    int num = 1;
    int indent = maxRows - 1;

    // Printing loop
    while (row < maxRows) {

        // Indent
        for (int i = 0; i < indent; ++i) 
            System.out.print("    ");

        // Print nums
        for (int i = 0; i < num; ++i) 
            System.out.printf("%4d", (int) Math.pow(2.0, i));
        for (int i = num - 2; i >= 0; --i)
            System.out.printf("%4d", (int) Math.pow(2.0, i));

        // New line
        System.out.println(""); 

        // Adjustments
        ++row;
        --indent;
        ++num;
    }

你意识到你永远不会改变num,对吗?你需要更新num,并跟踪你在队伍中的位置。如果notyetinhalf,num+=1;else num-=1;虽然你需要1,3,5,7的线长,但是你可以使用i++来表示…你金字塔的所有数字都是2的幂。。。考虑如何根据您在特定行中的位置获取指数!这并不难实现…我现在明白了。我会尝试一下,然后再回来。你知道你永远不会改变num,对吗?你需要更新num,并跟踪你在队伍中的位置。如果notyetinhalf,num+=1;else num-=1;虽然你需要1,3,5,7的线长,但是你可以使用i++来表示…你金字塔的所有数字都是2的幂。。。考虑如何根据您在特定行中的位置获取指数!这并不难实现…我现在明白了。我会尝试一下,然后再回来。这是唯一一个对任何输入都100%正确的答案。输出没有失真。好的。我的答案糟透了,所以我把它删除了。你能告诉我生成填充的逻辑吗?谢谢。@BoratSagdiyev嘿,我补充了解释。“我希望这会有帮助。”姆莱科竖起大拇指说。这是唯一一个对任何输入都100%正确的答案。输出没有失真。好的。我的答案糟透了,所以我把它删除了。你能告诉我生成填充的逻辑吗?谢谢。@BoratSagdiyev嘿,我补充了解释。“我希望这会有帮助。”姆莱科竖起大拇指说。这是令人敬畏的逻辑