如何创建一个使数字右侧对齐的java程序?

nfeuvbwi  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(387)

我的目的是一个java应用程序,从用户那里获取一个数字。启动1并将其写入控制台。每个新行序列将增加1,直到用户的数字令牌。重要的是把每一条线都对准右边。

Scanner in = new Scanner(System.in);
    int numberOfLines = in.nextInt();

    for (int rows = 1; rows <= numberOfLines; rows++) {
        for (int i = numberOfLines - rows; i >= 1; i--) {
            System.out.print("  ");
        }
        for (int col = rows; col >= 1; col--) {
            System.out.printf(" %d",col);
        }
        System.out.println();
    }

                     1
                   2 1
                 3 2 1
               4 3 2 1
             5 4 3 2 1
           6 5 4 3 2 1
         7 6 5 4 3 2 1
       8 7 6 5 4 3 2 1
     9 8 7 6 5 4 3 2 1
   10 9 8 7 6 5 4 3 2 1
 11 10 9 8 7 6 5 4 3 2 1

当达到两位数时,它不是右对齐的文本。我试图在循环中使用if条件,但做不到。

hec6srdp

hec6srdp1#

你的代码做得很好。你有一个问题,就是一旦你得到超过1位数的数字,它就会停止正常工作:在你的例子中,是10和11。
这实际上有点棘手-如果我输入'120392'?
你有几个选择。每个选项都更惊人,但也需要更多的代码。
限制您的输入。例如,不允许输入超过99,并假设所有数字的#位数等于允许的最大数字(因此,2位数)。
计算输入中的#位数,然后假设所有数字都有计算出的#位数。
只要把它弄对,应用的间距随着数字的增长而增加。
如果您选择第一个或第二个选项,您将得到如下结果:

1
                              2  1
                           3  2  1
                        4  3  2  1
                     5  4  3  2  1
                  6  5  4  3  2  1
               7  6  5  4  3  2  1
            8  7  6  5  4  3  2  1
         9  8  7  6  5  4  3  2  1
     10  9  8  7  6  5  4  3  2  1
 11  10  9  8  7  6  5  4  3  2  1

请注意,这比您的示例有更多的空格(两个空格之间,例如每 4 以及 3 而不是1。
那么,怎么做?对于#1和#2,您需要 System.out.printf("%2d"); -这意味着:打印一个数字,但如果需要少于2个字符,请用空格填充。
对于#1,硬编码为“2”(硬编码为99限制;或者,硬编码(3个空格和999限制)。对于#2,你得到你的输入,然后计算出数字是多少。像这样的 String.valueOf(limit).length(); 如果要这样做,则使用此长度构造格式字符串。
对于#3,您可以跟踪未打印的数字 System.out.print(" "); 循环,这样你仍然可以计算出你需要做的空白空间:如果你不打印10,那么你需要3个空格。如果你不打印500,你需要4个。如果你不打印5,你需要2。
对于#2和#3: printf("%4s", ""); 打印4个空格。这是您用来要求java打印x个空格的方法。解决方案2和3需要这个。
这听起来像是第一周的作业。我认为1是最合适的。

ni65a41a

ni65a41a2#

这里有一个不同的方法来考虑它使用字符串连接。
您可以首先生成最后一行,以确定每行必须具有的最大宽度。然后对于每一行,从当前行号倒计时到1,这样就知道了数字部分的宽度。最后,预先设置使当前行与最后一行一样宽所需的空间数。请注意,这是一个非常低效的字符串使用,但实际上我演示了一个不同的算法。提高记忆效率只会让人更难理解。还要注意,正确呈现的输出取决于您运行的环境,以及它如何显示长字符串。一些系统会添加一个滚动条,而另一些可能会导致字符串被 Package 。

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.print("Number of rows? ");
    int numberOfLines = in.nextInt();

    if (numberOfLines >= 1) {
        int totalWidth = 0;
        // add up the widths of the numbers themselves
        for (int number = 1; number <= numberOfLines; number++) {
            totalWidth = totalWidth + ("" + number).length();
        }
        // add in the spaces in-between the numbers
        totalWidth = totalWidth + (numberOfLines - 1);

        // now generate each row by counting backwards from the current row number
        for (int rowNumber = 1; rowNumber<=numberOfLines; rowNumber++) {
            String row = "";
            for (int i=rowNumber; i>=2; i--) {
                row = row + i + " ";
            }        
            row = row + "1";

            // prepend the spaces in front to make it as wide as the last row
            int paddingLength = totalWidth - row.length();
            for(int i=1; i<=paddingLength; i++) {
                row = " " + row;
            }

            // output the row
            System.out.println(row);
        } 
    }
    else {
        System.out.println("Number of rows must be positive!");
    }
}

25行输出示例:

Number of rows? 25
                                                                1
                                                              2 1
                                                            3 2 1
                                                          4 3 2 1
                                                        5 4 3 2 1
                                                      6 5 4 3 2 1
                                                    7 6 5 4 3 2 1
                                                  8 7 6 5 4 3 2 1
                                                9 8 7 6 5 4 3 2 1
                                             10 9 8 7 6 5 4 3 2 1
                                          11 10 9 8 7 6 5 4 3 2 1
                                       12 11 10 9 8 7 6 5 4 3 2 1
                                    13 12 11 10 9 8 7 6 5 4 3 2 1
                                 14 13 12 11 10 9 8 7 6 5 4 3 2 1
                              15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
                           16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
                        17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
                     18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
                  19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
               20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
            21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
         22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
      23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
   24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
xu3bshqb

xu3bshqb3#

为了使两个数字右对齐,其中一种方法是-在“col”的for循环之后,将每个数字转换为字符串,然后反转,然后打印。如果你不把它转换成字符串,那么像10,20,30等数字会被打印成1,2,3等

for (int rows = 1; rows <= numberOfLines; rows++) {
    for (int i = numberOfLines - rows; i >= 1; i--) {
        System.out.print("  ");
    }
    for (int col = rows; col >= 1; col--) {
      if(col>9){
        COL=Integer.toString(col);
        for(int i=COL.length();i>=0;i--)
        rev=rev+COL.charAt(i);
        System.out.printf(" %d",rev);
      }
      else
      System.out.printf("%d",col);

    }
    System.out.println();
}

相关问题