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 中,只是为了确认一切都按预期工作。我建议您也尝试一下,看看它是否能解决您的问题。
希望这对您有所帮助。
这个程序本质上是一个游戏,用户必须输入数字以查看哪些数字是好的:偶数个数字为偶数,奇数个数字为奇数。
所以首先,当我输入一位数字时程序结束,这不是故意的。我认为这与 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 中,只是为了确认一切都按预期工作。我建议您也尝试一下,看看它是否能解决您的问题。
希望这对您有所帮助。