我的目的是一个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条件,但做不到。
3条答案
按热度按时间hec6srdp1#
你的代码做得很好。你有一个问题,就是一旦你得到超过1位数的数字,它就会停止正常工作:在你的例子中,是10和11。
这实际上有点棘手-如果我输入'120392'?
你有几个选择。每个选项都更惊人,但也需要更多的代码。
限制您的输入。例如,不允许输入超过99,并假设所有数字的#位数等于允许的最大数字(因此,2位数)。
计算输入中的#位数,然后假设所有数字都有计算出的#位数。
只要把它弄对,应用的间距随着数字的增长而增加。
如果您选择第一个或第二个选项,您将得到如下结果:
请注意,这比您的示例有更多的空格(两个空格之间,例如每
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是最合适的。
ni65a41a2#
这里有一个不同的方法来考虑它使用字符串连接。
您可以首先生成最后一行,以确定每行必须具有的最大宽度。然后对于每一行,从当前行号倒计时到1,这样就知道了数字部分的宽度。最后,预先设置使当前行与最后一行一样宽所需的空间数。请注意,这是一个非常低效的字符串使用,但实际上我演示了一个不同的算法。提高记忆效率只会让人更难理解。还要注意,正确呈现的输出取决于您运行的环境,以及它如何显示长字符串。一些系统会添加一个滚动条,而另一些可能会导致字符串被 Package 。
25行输出示例:
xu3bshqb3#
为了使两个数字右对齐,其中一种方法是-在“col”的for循环之后,将每个数字转换为字符串,然后反转,然后打印。如果你不把它转换成字符串,那么像10,20,30等数字会被打印成1,2,3等