如何在java中打印降序数字的右对齐三角形?

问题描述 投票:0回答:1

我正在编写一个方法,它接受一个 int 并打印一个右对齐的降序直角三角形。我编写了一种使用嵌套循环的方法,该方法打印低于 99 的值的三角形,但由于较大数字中的额外数字而中断较高的值。我可以继续为不同的场景构建一堆 if-else,但我觉得我缺少一个更好的解决方案。

代码:



 public static void printTriangle(int nVal)
    {
        String sSpace = " ";
        // Loop for each row
        for (int i = 1; i <= nVal; i++)
        {
            if (i <10)
            {
                System.out.printf("%" + (nVal-9) + "s", sSpace);
                // Print spaces
                for (int j = 1; j <= nVal - i; j++)
                {
                    System.out.print("  ");
                }
                // Print descending numbers
                for (int k = i; k >= 1; k--)
                {
                    System.out.print(k + " ");
                }
            }
            else
            {
                if (i < 100)
                {// Print spaces
                    for (int j = 1; j <= nVal - i; j++)
                    {
                        System.out.print("   ");
                    }
                    // Print descending numbers
                    for (int k = i; k >= 1; k--)
                    {
                        System.out.print(k + " ");
                    }
                }
            }
            // Move to the next line
            System.out.println();
        }
    }
java loops nested
1个回答
0
投票

Java 三角问题

虽然这种方法可行,但随着涉及的数字变大,它会变得更加复杂。更好的解决方案是找到最大数字的位数(我们现在称之为

nVal
),然后使用该信息来确定三角形中所有数字的适当空间。

要获取给定数字中的位数

num,
,您可以使用以下公式
Math.log10(num) + 1,
,在应用此公式之前确保
num
是正数。

您修改的代码:

public static void printTriangle(int nVal) {
  // Calculate the number of digits of the largest number
  int maxDigits = (int) Math.log10(nVal) + 1;

  // Loop for each row
  for (int i = 1; i <= nVal; i++) {
    // Print spaces
    for (int j = 1; j <= nVal - i; j++) {
      for (int k = 0; k < maxDigits + 1; k++) { // +1 for the space after the nr
        System.out.print(" ");
      }
    }

    // Prints descending numbers
    for (int k = i; k >= 1; k--) {
      int currentDigits = (int) Math.log10(k) + 1;
      int padding = maxDigits - currentDigits;
      for (int l = 0; l < padding; l++) {
        System.out.print(" ");
      }
      System.out.print(k + " ");
    }
    System.out.println();
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.