使用 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();
    }

  }
  1. 正在打印在外部循环中初始化并在内部循环中更新的 k 变量。
  2. 设置条件来打破内循环和外循环以使用输入变量检查 k

已编辑: 为了更好地理解它:

  1. i变量用于维护我们需要打印的行数。
  2. j 变量用于维护每行中要打印的元素的数量。
  3. 在大多数情况下,正在打印的值与行号或行中的元素号相关联,但此处打印值与其不同步,因此我们将其维护在第二个变量 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
  2. 你有一个列变量,它在每行或每行上增加一个
  3. 你有一个数字,从 1 开始打印到输入的数字,例如输入 12。
  4. 在内部循环中,您需要检查列小于或等于行,并且递增的数字小于输入的数字。
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();
}