【问题标题】:Creating a Lottery创建彩票
【发布时间】:2015-02-09 22:19:59
【问题描述】:

生成一个三位数的彩票。程序提示用户输入一个三位数字,然后 根据以下规则判断用户是否获胜: (规则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 $10,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 $3,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 $1,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 $10,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 $3,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 $1,000");

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

这似乎最重要。我一直在循环数字来测试猜测。我没有遇到错误的猜测。 && guessSum == lotterySum) 仅与 RULE2 一起使用。

【问题讨论】:

  • &&|| 在第一个 else if 中的混合可能会导致问题。尝试在单独的语句中检查每个数字,或嵌套它们。

标签: java user-input


【解决方案1】:

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

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

这显然不是您要寻找的,因为这意味着多个猜测数字可以匹配同一个彩票数字,正如您遇到的 110 匹配 100 - 因为 1 和 @987654326 @ 都在中奖号码中,即使它不应该通过。

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

【讨论】:

  • ...你一针见血! ——至少在某种程度上我能理解。我看到它正在这样做,但我认为这是必需的,因为无论如何我都需要匹配。
  • 没关系。我已经失去了对它的理解。 1 == 1, 2 == 3, 3 == 2。我正在尽力将其可视化。
  • 请您澄清一下或者更好地向我解释一下。我已经解决了几个小时,但我仍然无法修复它。
  • @ChrisRedfieldea 请更新您的问题,提供更多详细信息、您尝试过的内容、遇到的问题等。从根本上说,您需要将每个数字与另一个数字进行比较,而您的当前解决方案与任何位进行比较。
  • 我想我无法解决这个问题,或者我从来没有打算这样做。如果语句必须有某种“记忆”来检查所有可能性,那么程序将不会被接受。我上面有的就是我能用的。 &&||if 语句
【解决方案2】:

这里的问题是你有重复,所以规则 2 的当前条件评估为真 100 110

为了消除这种影响,通常的变体是对数字和比较中的数字进行排序,如下所示(伪语言):

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

【讨论】:

  • 这种编码方式……我还没见过。
  • @ChrisRedfieldea 我不确定您在此处的“编码类型”下的意思,这只是一个想法,您可以在不使用数组/集合/的情况下将两个数字的数字比较为相同的集合/显式排序
  • 我还没有看到使用 Max/Min。我没那么远。
  • @ChrisRedfieldea 这是非常简单的函数,如果需要,您可以实现它们而不是使用库函数
【解决方案3】:

您的问题是您检查每个数字与彩票的每个数字。这就是您收到错误的原因,您需要记住您匹配的内容。 为了做到这一点,一个非常快速而肮脏的解决方案是检查双打并将它们替换为永远不会匹配的值,例如 -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 个 if。

【讨论】:

    【解决方案4】:

    正如@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 $10,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 $3,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 $1,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 语句如何涵盖所有这些排列。

    【讨论】:

    • 在你猜110 和彩票100 的例子中,你最终会得到 (matched1,matched2,matched3) 作为 (1,-1,-1 )。
    【解决方案5】:

    我想我知道这一点,这可能是因为 110 在规则 2 和规则 3 中为真,这就是它显示两个规则的输出的原因。这是我对 rule2 的布尔表达式

    ((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))
    

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

    【讨论】:

      【解决方案6】:

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

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

      使用此代码:

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

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

      【讨论】:

      • 对数字求和不起作用,这将引入许多冲突。例如,如果彩票是 456,则猜测 178 将符合规则 2。
      • 我的意思是把数字和已经存在的代码相加,作为对规则 2 的额外检查。但诚然,这可能不是最全面的解决方案。
      • 完全错了。数字相加无法正确匹配规则 2。
      【解决方案7】:

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

      会不会是这样的:

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

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

      【讨论】:

      • 我不在乎是否被降级。我正在尽力理解这一点。我没有看到我做错了什么。我已经经历了所有我能理解的组合......
      • 想想567和765,你不能只检查不同的位置。
      • ...请详细说明。
      • 我的答案包含所有条件语句,您需要找出彩票号码的所有排列和您的猜测。
      • 你为什么使用下面的公式来生成彩票号码: int lotteryDigit1 = lottery / 100; int lotteryDigit2 = (彩票 % 100) / 10; int lotteryDigit3 = 彩票 % 10;
      猜你喜欢
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      相关资源
      最近更新 更多