Java,偶数个偶数,奇数个奇数

Java, even number of even digits, odd number of odd digits

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

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

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

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

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

}

你每次输入一个数字时都会增加 numEven 或 numOdd 计数,然后你使用 if (numEven % 2 == 0 && numOdd % 2 == 1) ,它是随机的,因为如果你第一次输入数字 33 => numOdd = 1; => true => "Wallace likes" ,但是下次你第二次输入 33 => numOdd = 2; => 假 => "Wallace doesnt like".

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

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

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

34567

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

34567

游戏会将此数字处理为错误数字,因为奇数位的累加值将是 6 而不是 3(因为第一次 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 中,以便 运行 通过。如果我发现了什么,我会更新我的答案。

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

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

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

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

0.5、1.4232、3.142 ...

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

我之前提到的 "normal" 数字与编程中的 整数 关系最松散。它基本上是一个没有小数点的数字。这意味着无论何时将两个整数相除,总是得到另一个整数作为结果。因此,如果您将 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 中,只是为了确认一切都按预期工作。我建议您也尝试一下,看看它是否能解决您的问题。

希望这对您有所帮助。