【问题标题】:How do I combine these two while statements into one?如何将这两个 while 语句合并为一个?
【发布时间】:2016-09-23 13:05:00
【问题描述】:

我有两个 while 循环,一个是取 50 到 100 之间的奇数,另一个是取 50 到 100 之间的偶数。打印效果很好,但我的教授希望我改变它进入一个while循环而不是两个。我遇到了麻烦,因为我之前使用了 print 语句,以便它适合数字输入的时间。

 int e = 50;
 int o = 51;
 System.out.print("Even numbers between 50 and 100: 50,");
 while (e <= 98){
     e += 2;
     if (e%2 == 0){
        System.out.print(e + ",");
     }
 }
 System.out.print("\nOdd numbers between 50 and 100: 51,");
 while (o <= 97){
     o+= 2;

     if (e%1 == 0) { 
         System.out.print(o + ",");
     }
}


Even numbers between 50 and 100: 50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,
Odd numbers between 50 and 100: 51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99,

现在的输出看起来像这样,但我需要能够只用一个循环来代替

【问题讨论】:

  • e%1 == 0 - 你不是故意要输入的
  • 将偶数和奇数存入数组或字符串,最后打印
  • e%1 == 0 不会为您提供任何额外信息。 a%b == 0 表示 a 可以被 b 整除。因此,说 e%1 == 0 就是说 e 可以被 1 整除,这始终是正确的。您在这里要使用的是 e%2 == 0 (这意味着 e 可以被 2 整除,这意味着 e 是偶数)和 e%2 == 1 (这意味着 e 不能被 2 整除,这意味着 e 是奇数)。

标签: java while-loop


【解决方案1】:

如果您只想要一个 while 循环和单独的行,您应该构建您的字符串并在之后打印它们。 比如:

StringBuilder odds = new StringBuilder();
StringBuilder evens = new StringBuilder();
i = 50;
while(i<100) {
    if(i%2 == 1) {
        odds.append(i).append(",");
    }
    else {
        evens.append(i).append(",");
    }
    i++;
}
// remember that odds and evens now probably ends with a ','which you should remove
odds.removeCharAt(odds.size());
evens.removeCharAt(evens.size());
// or do something like the following:
//odds.append(" and nothing more!");
//evens.append(" and nothing more!");

System.out.println("Odd numbers are: ");
System.out.println(odds);
System.out.println("Even numbers are" ");
System.out.println(evens)

【讨论】:

  • 我总是想知道它是否真的有帮助,并且还没有被编译器优化为字符串生成器。但是,是的,你是对的!我知道什么...stackoverflow.com/questions/11942368/…
  • 如果我能找到链接,我会将其添加到此评论中,但使用 + 添加到字符串的 iirc 实际上使用字符串构建器,但它是循环的每次迭代的新对象。所以它肯定更慢。
  • 是的,我也找到了 :)
  • 如果有人好奇,我使用 repl.it 做了一个快速的模拟。我编写了两个循环,将数字 0 到 99999 附加到一个字符串中,一个使用字符串,一个使用 StringBuilder。使用字符串的实现需要 32.395368 秒来连接数字,而 StringBuilder 需要 0.003023 秒来连接数字并运行它的 toString() 方法。在 0 到 99 的较小范围内,字符串需要 0.000337,而 StringBuilder 需要 0.000060s。
【解决方案2】:

尝试在每一步中将计数器变量增加 1,并使用if 语句检查模数 (%)。如果等于0,则该数为偶数;如果它等于 1,那么这个数是奇数。对于单独打印,您可以使用两个列表或数组。

int count=50;
StringBuilder odds = new StringBuilder();
StringBuilder evens = new StringBuilder();

while(count<=100)
{
if(count%2==0) // here, the number is even, append this number to even string
   evens.append(count).append(",");

else // here, the number is odd, append this number to odds string
   odds.append(count).append(",");
count++;
}

// when everything is done, print the strings
// before doing that, you should remove the last comma at the end of these Strings. 
// Otherwise, you will have something like this: 93,95,97,

evens.setLength(evens.length() - 1); // to remove the comma at the end
odds.setLength(odds.length() - 1); // to remove the comma at the end

System.out.println("The even numbers are: " + evens.toString());
System.out.println("The odd numbers are: " + odds.toString());

使用StringBuilder 比对Strings 使用+= 类型的附加更有效。看看这个链接:

https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html

【讨论】:

  • while 循环的条件应该是count&lt;=100。发帖人的示例结果显示应该包括 100 个。
  • 谢谢,已更改。
  • 不,最好使用 StringBuilder。必须使用 SB。
  • 使用 SB 的效率要高得多得多得多。但最终由个人决定。
【解决方案3】:

您可以像这样使用单个 while 循环来打印奇数和偶数。

int e = 50;
    while (e <= 98)
    {       
        if (e%2 == 0)
        {
            System.out.println("even :"+e);
        }
        else
        {
            System.out.println("odd :"+e);
        }
        e++;
    }

【讨论】:

    【解决方案4】:

    只需创建2个字符串输出变量并根据条件将它们填充到循环中

    if (i%2==1)
      odd_output = odd_output + "," + i.toString 
    else
      even_output = even_output + "," + i.toString 
    

    (我可能在 Java 语法上错了)

    然后只需打印两个结果字符串以及您喜欢的任何其他信息

    【讨论】:

      【解决方案5】:

      我知道它不能直接回答问题(尽管输出相同),但在 2016 年,当人们想要打印一系列数字时,我们会这样做:

      public static void main(String[] args) {
          int[] evenNumbers = IntStream.rangeClosed(50, 100).filter(i -> i % 2 == 0).toArray();
          int[] oddNumbers = IntStream.rangeClosed(50, 100).filter(i -> i % 2 != 0).toArray();
      
          System.out.println("Even numbers between 50 and 100: " + Arrays.toString(evenNumbers));
          System.out.println("Odd numbers between 50 and 100: " + Arrays.toString(oddNumbers));
      }
      

      如果您的练习目标是学习如何使用while 循环,那么我的解决方案毫无用处。但是,如果您的目标是像现在一样练习 Java,我认为如果达到目标。

      【讨论】:

        【解决方案6】:

        这里你不需要维护任何单独的ArraysStrings,而是一个复杂的条件

        public class EvenOddTest {
            public static void main(String[] args) {
                // TODO Auto-generated method stub
                int num = 50;
                System.out.println("Even numbers between 50 and 100: ");
                while (num < 100){
                    if (num%2 == 0){
                        System.out.print(num + ",");
                    } else {
                        System.out.print(num + ",");
                    }
                    if( num == 98 ) {
                        num = 49;
                        System.out.println();
                        System.out.println("Odd numbers between 50 and 100: ");
                    }
                    num += 2;
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2014-06-18
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-07
          相关资源
          最近更新 更多