使用java的数字三角形

cetgtptt  于 2021-07-11  发布在  Java
关注(0)|答案(5)|浏览(377)

如果数字达到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
rwqw0loc

rwqw0loc1#

代码中应避免使用break和带标签的break。因此,您可以使用如下循环:

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变量用于保持每行中要打印的元素数。
在大多数情况下,被打印的值都与行号或行中的元素号在上下文中,但是这里的打印值与它不同步,所以我们在2rd变量k中维护它。

8ehkhllq

8ehkhllq2#

使用带标签的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();
}
csbfibhn

csbfibhn3#

有很多方法可以做到这一点。最简单的方法是使用一个标签一次中断几个循环:

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语句看起来与gotos可疑地相似,gotos是不受欢迎的。更适合教师的版本是使用布尔标志,并检查每个循环中的标志:

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中定义循环变量,因此尝试在循环之外使用它们是错误的。这有助于避免意外重用变量。

p1iqtdky

p1iqtdky4#

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

pqwbnv8z5#

通过将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();
}

相关问题