【问题标题】:Java, even number of even digits, odd number of odd digitsJava,偶数个偶数,奇数个奇数
【发布时间】:2015-11-07 05:09:47
【问题描述】:

这个程序本质上是一个游戏,用户必须输入数字来查看哪些数字是好的:具有偶数个偶数的数字,以及具有奇数个奇数的数字。

首先,当我输入一个数字时程序结束,这不是故意的。我认为这与 while (n > 0) 有关。 if (numEven % 2 == 0......) 也可能存在问题,因为打印结果看起来几乎是随机的,有时数字很好,有时相同的数字不好。

老实说,我现在迷路了。非常感谢您的帮助。

更新:此代码按我的意愿运行,我只想感谢所有提供帮助的人!这是我第一个学期的计算机科学课,所以我在这方面还是很陌生...请原谅我可能很愚蠢的错误:)

package quackygame;
import java.util.Scanner;
public class QuackyGame 
{
    public static void main(String[] args) 
   {
       System.out.println("Welcome to the Number Game!"
                + " Try to figure out the pattern "
                + "in the numbers that Wallace likes!");

        Scanner scan = new Scanner (System.in);
        int n;
        int numEven = 0;
        int numOdd = 0;
        boolean isEven;

        do
        {
           System.out.print("Enter a number > 0: ");
           n = scan.nextInt();
           while (n > 0)
           {
               if (n % 2 == 0)
                 {
                   //n is even
                   isEven = true;
                   numEven++;
                 }
                else
                 {
                   //n is odd
                   isEven = false;
                   numOdd++;
                 }
               n /= 10;
           }
           //if numEven is even and numOdd is odd
           if (numEven % 2 == 0 && numOdd % 2 == 1)
               System.out.println("Wallace liked your number!");
           else
           {
               System.out.println("Wallace didn't like your number.");
           }
           numEven = 0;
           numOdd = 0;

        }

        while (n >= 0); 
    }

}

【问题讨论】:

  • 如果您的要求是 the program ends when 1 digit number entered 那么为什么条件是 n>0 ?应该是n>10吧?
  • 检查n /= 10;
  • 如果您想确保人们知道您的问题已经得到解答,要么接受当前答案之一,要么做出自己的答案并接受。这将添加一个绿色复选标记,以便人们可以看到您对解决您的问题感到满意。您可以通过单击答案旁边的复选标记来接受答案。

标签: java while-loop digits


【解决方案1】:

根据您描述的预期结果,代码中存在一些核心问题。我看到的最明显的问题是您打算让游戏在每一轮开始时基本上“从头开始”,但您从未真正重置 numEven 和 numOdd 变量。这是您的打印结果看似随机的来源。例如,如果您开始游戏并输入数字:

34567

游戏会处理这个数字并说它是一个有利的数字,因为它是奇数,有奇数个奇数 (3),并且有偶数个偶数 (2)。但是,再次玩游戏时,它会执行相同的代码而不会将变量设置回 0,这意味着在输入时:

34567

游戏会将这个数字视为错误数字,因为奇数的累积值将是 6 而不是 3(因为第一次为 3 + 第二次为 6),而 6 是偶数。所以我们要做的是:

...

int n;

do
{
    int numEven = 0;
    int numOdd = 0;

    System.out.print("Enter a number: ");
    n = scan.nextInt();

...

通过将 numEven 和 numOdd 声明放在“do”块内,它们是局部变量,仅在 do 块期间存在。我们也可以做一些像这样简单的事情:

...

    else
    {
        System.out.println("Wallace didn't like your number.");
    }
    numEven = 0;
    numOdd = 0;
}
while (n > 0);

...

只需重置这些值将有助于我们更一致地跟踪 numOdd 和 numEven 的实际预期值。

关于输入一位数时程序关闭,我不确定。这没有任何意义,因为它是一个 do-while 循环,它应该至少执行一次,并发出其中一个打印语句。我现在正在将这段代码加载到我的 IDE 中以试运行。如果我发现了什么,我会更新我的答案。

-EDIT-:再次阅读您的问题后,您似乎不是建议程序在实际完成其任何功能之前关闭,而只是说它完全关闭。关闭程序的原因是您正在执行整数除法算术函数,您可能希望使用不同类型的数字。让我解释一下:

在正常的人类计数中,我们有一组没有小数点的自然数字。他们通常是这样开始的:

1、2、3、4、5 ...

然后我们有一组单独的数学数字,我们可以更精确地进行运算:

0.5、1.4232、3.142 ...

当我们用正常的人类语言谈论数字时,我们假设 1 除以 2 得到 0.5。然而,计算机并不隐含地知道这一点。为了让计算机从 1 除以 2 得出结论“0.5”,您需要明确告诉它应该使用某种类型的数字来产生该输出。

我之前提到的“正常”数字与编程中的整数关系最为松散。它基本上是一个没有小数点的数字。这意味着每当您将两个整数相除时,您总是会得到另一个整数作为结果。因此,如果您将 1 除以 2,计算机不会将结果解释为 0.5,因为该数字有小数点。相反,它会将其向下舍入到最接近的整数,在本例中为 0。

因此,举一个更具体的示例来引用手头的实际问题,假设我们在程序中输入了数字 5。它经历了所有赔率和偶数的计算,但最终到达了这一行:

n /= 10

这就是事情变得时髦的地方。我们将两个整数相除,但它们的结果并不是一个完美的整数。在这种情况下,5 / 10 的结果又是 0.5。 但是对于计算机,由于我们是在除以两个整数,所以结果 0.5 是不行的,所以在四舍五入到最接近的整数后,我们得到 0。在这一点上,有一个致命的错误:

(while n > 0);

当我们执行这个检查时,我们得到 false 并且 while 循环结束。为什么?因为执行 n /= 10 后,n 变为 0。而 0 大于 0。

我们该如何解决这个问题?最好的办法可能只是使用浮点数来执行计算。在 Java 中,这很容易。我们真正要做的就是:

n /= 10.0

当 Java 看到我们除以 10.0(不是整数)时,它会自动将“n”转换为浮点数以除以 10.0。在这种情况下,如果 n 为 5,我们将 5 除以 10.0 的结果将是 0.5。然后,当我们运行时:

(while n > 0);

这成为现实!并且循环不会中断。

我将把所有这些更改放入我的 IDE 中,只是为了确认一切都按我的预期工作。我建议你也试试看它是否能解决你的问题。

希望这会有所帮助。

【讨论】:

  • 我实际上确实打算使用 n/=10 而不是 n /= 10.0 因为我正在执行该操作以删除数字的最后一位以检查下一位是否为偶数或奇数。它除以 10,将最后一位的数字保留为小数,而小数则被 int 截断。所以,在你建议的 else 语句之后,我将 numEven 和 numOdd 重置为零,现在我的程序说偶数是坏的,奇数是好的……这又不是我所希望的。我认为这与我的 if (numEven % 2 == 0 && numOdd % 2 == 1) 有关
  • @mjamev10 如果要确保执行正确的条件检查,请使用括号:(((numEven % 2) == 0) && ((numOdd % 2) == 1))我的例子有点矫枉过正,但你明白了。至于 /= 10 操作,只需添加一个单独的条件,当 n 已经 =10) n /= 10.
  • 好吧,我的代码现在按计划工作了; if 语句实际上还可以,并且 n /= 10 也可以按照我的意愿工作。谢谢您的帮助!这是我学习计算机科学的第一个学期,所以我还是很陌生:)
  • @mjamev10 太棒了,很高兴听到。我可以通过添加的更改来编辑我的答案。
【解决方案2】:

每次输入数字时都会增加 numEven 或 numOdd 计数,然后使用 if (numEven % 2 == 0 && numOdd % 2 == 1) ,这是随机的,因为如果您第一次输入数字 33 => numOdd = 1; => true => "Wallace likes" ,但是下次你第二次输入 33 => numOdd = 2; => false => “华莱士不喜欢”。

编辑* 也许你想要这样的东西?

public static void main(String[] args) 
{
       System.out.println("Welcome to the Number Game!"
                + " Try to figure out the pattern "
                + "in the numbers that Wallace likes!");

        Scanner scan = new Scanner (System.in);
        int n;
        boolean isEven;

        do
        {
           System.out.print("Enter a number: ");
           n = scan.nextInt();

           //if 0, you leave the loop
           if(n==0) {
               System.out.println("You pressed 0, have a nice day");
               break;
           }
           if (n % 2 == 0)
           {
               //it is even
               isEven = true;
           }

           else
           {
               //it is not even
               isEven = false;
           }


           //if even then he likes it, otherwise he does not
           if (isEven)
               System.out.println("Wallace liked your number!");
           else
           {
               System.out.println("Wallace didn't like your number.");
           }

        }
        //put any contition here, lets say if you press 0 , you leave the loop
        while (n != 0); 
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-19
    • 2015-05-31
    • 1970-01-01
    • 2017-02-06
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多