我正在编写一个方法,它接受一个 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();
}
}
虽然这种方法可行,但随着涉及的数字变大,它会变得更加复杂。更好的解决方案是找到最大数字的位数(我们现在称之为
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();
}
}