Java,偶数位偶数,奇数位数

时间:2015-11-07 05:09:47

标签: java while-loop digits

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

首先,当我输入一位数时,程序结束,这不是故意的。我认为这与while 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); 
    }

}

2 个答案:

答案 0 :(得分:1)

根据您描述的所需结果,代码中存在一些核心问题。我看到的最明显的问题是你打算让游戏在每轮开始时基本上“从头开始”,但你从未真正重置过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();

...

通过在“do”块中放置numEven和numOdd声明,它们是局部变量,仅在do块的持续时间内存在。我们也可以做一些简单的事情:

...

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

...

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

关于输入单个数字时程序关闭,我不确定。这没有意义,因为它是一个do-while循环,它应该在至少执行一次,并发出一个print语句。我现在正在将此代码加载到我的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中,只是为了确认一切正常。我建议你试试看它是否能解决你的问题。

希望这有帮助。

答案 1 :(得分:0)

每次输入数字时,您都会增加numEven或numOdd计数,然后使用if (numEven % 2 == 0 && numOdd % 2 == 1),这是随机的,因为如果您第一次输入数字33 => numOdd = 1; => true => "华莱士喜欢" ,但下次你第二次放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); 
    }