使用 java 的数值三角形
Numerical triangle using java
如果数字达到n,如何停止循环?我尝试了 break;
但循环仍然没有停止。
Scanner in = new Scanner(System.in);
int i, j;
int n = in.nextInt();
int number = 1;
for(i = 1; i <= n; ++i) {
for(j = 1; j <= i; ++j) {
System.out.print(number);
++number;
if(number >= n){
break;
}
}
System.out.println();
}
输入: 9
预期输出:
1
23
456
789
或
输入: 12
预期输出:
1
23
456
78910
1112
使用带标签的 break 语句,您可以从嵌套循环中中断:
loop:
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= i; ++j)
{
System.out.print(number);
++number;
if (number > n) //not (number >= n)
{
break loop;
}
}
System.out.println();
}
代码中应避免中断和标记中断。所以你可以使用如下循环:
public static void main(final String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Please enter input number:");
int n = in.nextInt();
System.out.println("You have entered : " + n);
for (int i = 1, k = 1; k <= n; i++) {
for (int j = 0; j < i && k <= n; j++, k++) {
System.out.print(k);
}
System.out.println();
}
}
- 正在打印在外部循环中初始化并在内部循环中更新的 k 变量。
- 设置条件来打破内循环和外循环以使用输入变量检查 k
已编辑: 为了更好地理解它:
- i变量用于维护我们需要打印的行数。
- j 变量用于维护每行中要打印的元素的数量。
- 在大多数情况下,正在打印的值与行号或行中的元素号相关联,但此处打印值与其不同步,因此我们将其维护在第二个变量 k 中。
有很多方法可以做到这一点。最直接的就是用一个标签一次跳出几个循环:
outer: for(i = 1; i <= n; ++i) { // a label is a word followed by :
inner: for(j = 1; j <= i; ++j) { // you can declare labels without using them
System.out.print(number);
++number;
if(number >= n){
break outer; // break inner would be equivalent to what you had
}
}
System.out.println();
}
但是,这些带有标签的 break 语句看起来与 goto 非常相似,因此 goto 不受欢迎。对教师更友好的版本是使用布尔标志,并在每个循环中检查标志:
boolean finished = false;
for(i = 1; i <= n && ! finished; ++i) {
for(j = 1; j <= i && ! finished; ++j) {
System.out.print(number);
++number;
if (number >= n) {
finished = true; // no need to break - loops condition will now be false
}
}
System.out.println();
}
请注意,这引入了一个额外的换行符,您通常希望确保接下来打印的内容出现在不同的行上。
另一种选择是简单地使您的初始条件复杂化,没有任何标志:
for(i = 1; i <= n && number < n; ++i) {
for(j = 1; j <= i; ++j) {
System.out.print(number);
++number;
}
System.out.println();
}
出于可读性的目的,我建议使用版本 2。此外,我会这样写:
boolean finished = false;
for(int i = 0; i < n && ! finished; ++i) {
for(j = 0; j < i && ! finished; ++j) {
System.out.print(number++);
if (number >= n) {
finished = true;
}
}
System.out.println();
}
主要区别在于使用 0 到 n-1 计数来重复某事 n 次(大多数程序员非常习惯这样做,而不是从 1 到 n 计数),并在 for 中定义循环变量,以便尝试在循环之外使用它们是错误的。这有助于避免意外重用变量。
import java.util.Scanner;
public class Tester{
public static void main(String []args){
Scanner in = new Scanner(System.in);
int i, j;
int n = in.nextInt();
int number = 1;
loop:
for ( i = 1; i <= n; ++i){
for ( j = 1; j <= i; ++j){
System.out.print(number);
++number;
if (number > n)
{
break loop;
}
}
System.out.println();
}
}
}
通过使用带有嵌套循环的 for 循环,您可以像这样实现它:
- 你有一行在每一行(行)上递增 1
- 你有一个列变量,它在每行或每行上增加一个
- 你有一个数字,从 1 开始打印到输入的数字,例如输入 12。
- 在内部循环中,您需要检查列小于或等于行,并且递增的数字小于输入的数字。
Scanner in = new Scanner(System.in);
System.out.print("Enter a Number: ");
int n = in.nextInt();
int number = 1;
for (int row = 1; row <= n && number <= n; row++) {
for (int column = 1; column <= row && number <= n; column++) {
System.out.print((number++) + " ");
}
System.out.println();
}
如果数字达到n,如何停止循环?我尝试了 break;
但循环仍然没有停止。
Scanner in = new Scanner(System.in);
int i, j;
int n = in.nextInt();
int number = 1;
for(i = 1; i <= n; ++i) {
for(j = 1; j <= i; ++j) {
System.out.print(number);
++number;
if(number >= n){
break;
}
}
System.out.println();
}
输入: 9
预期输出:
1
23
456
789
或
输入: 12
预期输出:
1
23
456
78910
1112
使用带标签的 break 语句,您可以从嵌套循环中中断:
loop:
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= i; ++j)
{
System.out.print(number);
++number;
if (number > n) //not (number >= n)
{
break loop;
}
}
System.out.println();
}
代码中应避免中断和标记中断。所以你可以使用如下循环:
public static void main(final String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Please enter input number:");
int n = in.nextInt();
System.out.println("You have entered : " + n);
for (int i = 1, k = 1; k <= n; i++) {
for (int j = 0; j < i && k <= n; j++, k++) {
System.out.print(k);
}
System.out.println();
}
}
- 正在打印在外部循环中初始化并在内部循环中更新的 k 变量。
- 设置条件来打破内循环和外循环以使用输入变量检查 k
已编辑: 为了更好地理解它:
- i变量用于维护我们需要打印的行数。
- j 变量用于维护每行中要打印的元素的数量。
- 在大多数情况下,正在打印的值与行号或行中的元素号相关联,但此处打印值与其不同步,因此我们将其维护在第二个变量 k 中。
有很多方法可以做到这一点。最直接的就是用一个标签一次跳出几个循环:
outer: for(i = 1; i <= n; ++i) { // a label is a word followed by :
inner: for(j = 1; j <= i; ++j) { // you can declare labels without using them
System.out.print(number);
++number;
if(number >= n){
break outer; // break inner would be equivalent to what you had
}
}
System.out.println();
}
但是,这些带有标签的 break 语句看起来与 goto 非常相似,因此 goto 不受欢迎。对教师更友好的版本是使用布尔标志,并在每个循环中检查标志:
boolean finished = false;
for(i = 1; i <= n && ! finished; ++i) {
for(j = 1; j <= i && ! finished; ++j) {
System.out.print(number);
++number;
if (number >= n) {
finished = true; // no need to break - loops condition will now be false
}
}
System.out.println();
}
请注意,这引入了一个额外的换行符,您通常希望确保接下来打印的内容出现在不同的行上。
另一种选择是简单地使您的初始条件复杂化,没有任何标志:
for(i = 1; i <= n && number < n; ++i) {
for(j = 1; j <= i; ++j) {
System.out.print(number);
++number;
}
System.out.println();
}
出于可读性的目的,我建议使用版本 2。此外,我会这样写:
boolean finished = false;
for(int i = 0; i < n && ! finished; ++i) {
for(j = 0; j < i && ! finished; ++j) {
System.out.print(number++);
if (number >= n) {
finished = true;
}
}
System.out.println();
}
主要区别在于使用 0 到 n-1 计数来重复某事 n 次(大多数程序员非常习惯这样做,而不是从 1 到 n 计数),并在 for 中定义循环变量,以便尝试在循环之外使用它们是错误的。这有助于避免意外重用变量。
import java.util.Scanner;
public class Tester{
public static void main(String []args){
Scanner in = new Scanner(System.in);
int i, j;
int n = in.nextInt();
int number = 1;
loop:
for ( i = 1; i <= n; ++i){
for ( j = 1; j <= i; ++j){
System.out.print(number);
++number;
if (number > n)
{
break loop;
}
}
System.out.println();
}
}
}
通过使用带有嵌套循环的 for 循环,您可以像这样实现它:
- 你有一行在每一行(行)上递增 1
- 你有一个列变量,它在每行或每行上增加一个
- 你有一个数字,从 1 开始打印到输入的数字,例如输入 12。
- 在内部循环中,您需要检查列小于或等于行,并且递增的数字小于输入的数字。
Scanner in = new Scanner(System.in);
System.out.print("Enter a Number: ");
int n = in.nextInt();
int number = 1;
for (int row = 1; row <= n && number <= n; row++) {
for (int column = 1; column <= row && number <= n; column++) {
System.out.print((number++) + " ");
}
System.out.println();
}