创建彩票

Creating a Lottery

生成一个三位数的彩票。该程序提示用户输入一个三位数,然后 根据以下规则判断用户是否获胜: (规则1)。如果用户输入的顺序与彩票号码完全匹配,则奖励为 10,000 美元。 (规则 2)。如果用户输入的所有数字都与彩票号码中的所有数字匹配,则中奖 3,000 美元。 (规则 3)。如果用户输入的一位数字与彩票号码中的一位数字相匹配,则中奖 1,000 美元。

我需要帮助让我的程序按照代码中的所有内容正常运行。没有数组,没有字符串,只有已经存在的东西。我的问题是我无法猜测 110 以忽略规则 2。我将其设置为 100 以测试所有规则。

import java.util.Scanner;

public class NewClass {
    public static void main(String[] args) {
        int lottery = 100;

 // Prompt the user to enter a guess
        Scanner input = new Scanner(System.in);
        System.out.print("Enter your lottery pick (three digits): ");
        int guess = input.nextInt();

 // Get digits from lottery
        int lotteryDigit1 = lottery / 100;
        int lotteryDigit2 = (lottery % 100) / 10;
        int lotteryDigit3 = lottery % 10;

 // Get digits from guess
        int guessDigit1 = guess / 100;
        int guessDigit2 = (guess % 100) / 10;
        int guessDigit3 = guess % 10;

        System.out.println("The lottery number is " + lottery);

 // RULE1 Check the guess
        if (guess == lottery)
            System.out.println("Exact match: you win ,000");
 // RULE2   
        else if ((guessDigit1 == lotteryDigit1
            || guessDigit1 == lotteryDigit2 
            || guessDigit1 == lotteryDigit3)
            && (guessDigit2 == lotteryDigit1
            || guessDigit2 == lotteryDigit2
            || guessDigit2 == lotteryDigit3)
            && (guessDigit3 == lotteryDigit1
            || guessDigit3 == lotteryDigit2
            || guessDigit3 == lotteryDigit3))
            System.out.println("Match all digits: you win ,000");
    // RULE3
        else if ((guessDigit1 == lotteryDigit1
            || guessDigit1 == lotteryDigit2
            || guessDigit1 == lotteryDigit3)
            || (guessDigit2 == lotteryDigit1
            || guessDigit2 == lotteryDigit2
            || guessDigit2 == lotteryDigit3)
            || (guessDigit3 == lotteryDigit1
            || guessDigit3 == lotteryDigit2
            || guessDigit3 == lotteryDigit3))   
            System.out.println("Match one digit: you win ,000");

        else
            System.out.println("Sorry, no match");
    }
 }

更新:

import java.util.Scanner;
    public class NewClass {
        public static void main(String[] args) {
        int lottery = 456;

 // Prompt the user to enter a guess
        Scanner input = new Scanner(System.in);
        System.out.print("Enter your lottery pick (three digits): ");
        int guess = input.nextInt();

 // Get digits from lottery
        int lotteryDigit1 = lottery / 100;
        int lotteryDigit2 = (lottery % 100) / 10;
        int lotteryDigit3 = lottery % 10;

 // Get digits from guess
        int guessDigit1 = guess / 100;
        int guessDigit2 = (guess % 100) / 10;
        int guessDigit3 = guess % 10;

        System.out.println("The lottery number is " + lottery);

  // Sum up both sets of digits to compare for 3 inconsecutive matches
        int guessSum = guessDigit1 + guessDigit2 + guessDigit3;
        int lotterySum = lotteryDigit1 + lotteryDigit2 + lotteryDigit3;

 // RULE1 Check the guess
        if (guess == lottery)
            System.out.println("Exact match: you win ,000");
 // RULE2   
        else if ((guessDigit1 == lotteryDigit1
            || guessDigit1 == lotteryDigit2 
            || guessDigit1 == lotteryDigit3)
            && (guessDigit2 == lotteryDigit1
            || guessDigit2 == lotteryDigit2
            || guessDigit2 == lotteryDigit3)
            && (guessDigit3 == lotteryDigit1
            || guessDigit3 == lotteryDigit2
            || guessDigit3 == lotteryDigit3)
            && guessSum == lotterySum)      
            System.out.println("Match all digits: you win ,000");
// RULE3
        else if ((guessDigit1 == lotteryDigit1
            || guessDigit1 == lotteryDigit2
            || guessDigit1 == lotteryDigit3)
            || (guessDigit2 == lotteryDigit1
            || guessDigit2 == lotteryDigit2
            || guessDigit2 == lotteryDigit3)
            || (guessDigit3 == lotteryDigit1
            || guessDigit3 == lotteryDigit2
            || guessDigit3 == lotteryDigit3))   
            System.out.println("Match one digit: you win ,000");

        else
            System.out.println("Sorry, no match");
    }
 }

这似乎最有效。我一直在循环数字以测试猜测。我没有遇到过错误的猜测。 && guessSum == lotterySum) 仅与规则 2 一起使用。

这里的问题是您有重复项,因此对于 100 <=> 110

,规则 2 的当前条件评估为真

为了消除这种影响,通常的变体是对数字中的数字进行排序并进行比较,就像这样(伪语言):

if (sortDigits(lottery) == sortDigits(guess))

如果您不能使用数组,这里是对 3 位数字进行排序的简单函数:

int sortDigits(int n) {
int d1 = n/100;
int d2 = (n/10)%10;
int d3 = n%10;

int min = Math.min(d1, Math.min(d2, d3));
int max = Math.max(d1, Math.max(d2, d3));
int mid = -1;
if (min == d1) mid = Math.min(d2, d3);
else if (min == d2) mid = Math.min(d1, d3);
else mid = Math.min(d1, d2);

return (min*100) + (mid*10) + max;
}

你的问题是你用彩票的每个数字来检查猜测的每个数字。这就是您收到错误的原因,您需要记住您匹配的内容。 为了做到这一点,一个非常快速和肮脏的解决方案是检查双打并将它们替换为永远不会匹配的值,比如 -1:

    if(guessDigit1 == guessDigit2){
        guessDigit1 = -1;
    }
    else if (guessDigit1 == guessDigit3 ) {
        guessDigit1 = -1;
    }
    else if (guessDigit2 == guessDigit3 ) {
        guessDigit2 = -1;
    }

请注意,这根本不是最佳解决方案!

更新:为了记住您检查过的内容,您必须执行许多 if 条件。其中之一的伪代码如下:

If guessDigit2 == lotteryDigit1 
    if guessDigit1 == lotteryDigit2 
        if guessDigit3 == lotteryDigit3
             -> You found all digits
    else if guessDigit1 == lotteryDigit3
        if guessDigit3 == lotteryDigit2
        -> You found all digits

当然你必须实现这段代码 * 3 因为你需要为 guessDigit1 == lotteryDigit1 和 guessDigit3 == lotteryDigit1 创建另外 2 个 ifs。

您对规则 2 的条件错误;它目前说(在伪代码中):

IF  guessDigit1 is anyLotteryDigit
AND guessDigit2 is anyLotteryDigit
AND guessDigit3 is anyLotteryDigit

这显然不是您要找的,因为这意味着多个猜测数字可以匹配相同的彩票数字,因为您 运行 与 110 匹配 100 - 因为 10 都在中奖号码中,所以即使它不应该通过。

相反,您希望将每个数字与 剩余 个数字相匹配。 "right" 方法是使用 Set,但听起来您还不能使用它们。您可以手动完成,写出所有案例只是一些工作。基本上,您将猜测的一位数字与彩票的一位数字进行比较,然后将剩余的两个猜测数字 与剩余的两个彩票数字 进行比较。对每个数字重复冲洗。

我认为问题在于您没有考虑重复数字。您可以检查以确保所有数字加起来等于样本编号,即:

1+1+0 = 2
1+0+0 = 1
1!=2
Move onto rule 3. 

使用此代码:

guessDigit1  + guessDigit2 + guessDigit3 == lotteryDigit1 + lotteryDigit2 + lotteryDigit3

我不知道这是否会解决您的所有问题,但这是一个开始,它应该可以解决您的“110”值的直接问题。祝你好运!

正如@dimo414(和其他答案)所提到的,您需要某种内存来检查您要检查的数字。以下条件将为您提供您正在寻找的排列。如果 matched1matched2matched3 最后是 -1,则不匹配。

import java.util.Scanner;

public class NewClass {
    public static void main(String[] args) {
        int lottery = 100;

        // Prompt the user to enter a guess
        Scanner input = new Scanner(System.in);
        System.out.print("Enter your lottery pick (three digits): ");
        int guess = input.nextInt();

        // Get digits from lottery
        int lotteryDigit1 = lottery / 100;
        int lotteryDigit2 = (lottery % 100) / 10;
        int lotteryDigit3 = lottery % 10;

        // Get digits from guess
        int guessDigit1 = guess / 100;
        int guessDigit2 = (guess % 100) / 10;
        int guessDigit3 = guess % 10;

        System.out.println("The lottery number is " + lottery);

        int matched1 = -1;
        int matched2 = -1;
        int matched3 = -1;

        // RULE1 Check the guess
        if (guess == lottery) {
            System.out.println("Exact match: you win ,000");
        } 
        // RULE2   
        else {
            if (guessDigit1 == lotteryDigit1) {
                matched1 = 1;
                if (guessDigit2 == lotteryDigit2) {
                    matched2 = 2;
                    if (guessDigit3 == lotteryDigit3) {
                        matched3 = 3;
                    }
                } else if (guessDigit2 == lotteryDigit3) {
                    matched2 = 3;
                    if (guessDigit3 == lotteryDigit2) {
                        matched3 = 2;
                    }
                }
            } else if (guessDigit1 == lotteryDigit2) {
                matched1 = 2;
                if (guessDigit2 == lotteryDigit1) {
                    matched2 = 1;
                    if (guessDigit3 == lotteryDigit3) {
                        matched3 = 3;
                    }
                } else if (guessDigit2 == lotteryDigit3) {
                    matched2 = 3;
                    if (guessDigit3 == lotteryDigit1) {
                        matched3 = 1;
                    }
                }
            } else if (guessDigit1 == lotteryDigit3) {
                matched1 = 3;
                if (guessDigit2 == lotteryDigit1) {
                    matched2 = 1;
                    if (guessDigit3 == lotteryDigit2) {
                        matched3 = 2;
                    }
                } else if (guessDigit2 == lotteryDigit2) {
                    matched2 = 2;
                    if (guessDigit3 == lotteryDigit1) {
                        matched3 = 1;
                    }
                }
            }

            if (matched1 != -1 && matched2 != -1 && matched3 != -1) {
                System.out.println("Match all digits: you win ,000");
            } 
            // RULE3
            else if ((guessDigit1 == lotteryDigit1 || guessDigit1 == lotteryDigit2 || guessDigit1 == lotteryDigit3)
                    || (guessDigit2 == lotteryDigit1 || guessDigit2 == lotteryDigit2 || guessDigit2 == lotteryDigit3)
                    || (guessDigit3 == lotteryDigit1 || guessDigit3 == lotteryDigit2 || guessDigit3 == lotteryDigit3)) {  
                    System.out.println("Match one digit: you win ,000");
            } else {
                System.out.println("Sorry, no match");
            }
        }
    }
 }

这首先检查您猜测的第一个数字是否是彩票的第一个数字。如果是这样,它会保存 matched1(对于您猜测的数字)和值 1(对于彩票中的第一个数字)。然后它检查第二个猜到的数字与彩票的数字 2 和 3 的比较。我们不会在这里再次检查您猜测的第二位数字与彩票的第一位数字,因为我们已经知道第一位猜测与第一位彩票相匹配。如果第一个数字与第一个彩票号码不匹配,那么我们看猜测的第一个数字是否是彩票号码的第二个数字,然后冲洗并重复。 (如果是这样,则 matched1 将为彩票的第二位数字 2。)

(matched1,matched2,matched3)的所有匹配值为(1,2,3),(1,3,2),(2,1,3),(2,3,1),( 3,1,2) 和 (3,2,1)。您可以看到上面的嵌套 if 语句是如何涵盖所有这些排列的。

相反,您希望将每个数字与其余数字匹配。 "right" 方法是使用 Set,但听起来您还不能使用它们。您可以手动完成,写出所有案例只是一些工作。基本上,您将猜测的一位数字与彩票的一位数字进行比较,然后将剩余的两个猜测数字与剩余的两个彩票数字进行比较。对每个数字重复冲洗。

会不会是这样的:

else if ((guessDigit1 == lotteryDigit2 
            || guessDigit1 == lotteryDigit3)
            && (guessDigit2 == lotteryDigit1
            || guessDigit2 == lotteryDigit3)
            && (guessDigit3 == lotteryDigit1
            || guessDigit3 == lotteryDigit2))
            System.out.println("Match all digits: you win ,000");

我只能使用这些 -- 没有其他公式。一个用来上交我的代码的程序对输入非常讲究。它只会接受已设置为接受的内容。

我想我知道这一点,这可能是因为 110 在规则 2 和规则 3 中都是正确的,这就是为什么它显示两个规则的输出。这是规则 2

的布尔表达式
((guessDigit1 == lotteryDigit2
            && guessDigit2 == lotteryDigit3
            && guessDigit3 == lotteryDigit1)
            || (guessDigit1 == lotteryDigit3
            && guessDigit2 == lotteryDigit1
            && guessDigit3 == lotteryDigit2)
            || (guessDigit1 == lotteryDigit1
            && guessDigit2 == lotteryDigit3
            && guessDigit3 == lotteryDigit2)
            || (guessDigit1 == lotteryDigit3
            && guessDigit2 == lotteryDigit2
            && guessDigit3 == lotteryDigit1)
            || (guessDigit1 == lotteryDigit2
            && guessDigit2 == lotteryDigit1
            && guessDigit3 == lotteryDigit3))

所有可能的答案都在那里。