Создание лотереи

1

Создайте лотерею трехзначного числа. Программа предложит пользователю ввести трехзначное число и определит, победит ли пользователь в соответствии со следующими правилами: (ПРАВИЛО 1). Если вход пользователя совпадает с номером лотереи в точном порядке, сумма вознаграждения составляет 10 000 долларов США. (ПРАВИЛО 2). Если все цифры в пользовательском вводе соответствуют всем цифрам в номере лотереи, вознаграждение составляет 3000 долларов США. (ПРАВИЛО 3). Если одна цифра в пользовательском вводе соответствует цифре в номере лотереи, вознаграждение составляет 1000 долларов США.

Мне нужна помощь, чтобы моя программа функционировала по назначению со всем, что видно в коде. Никаких массивов, никаких строк, ничего, кроме того, что уже есть. Моя проблема в том, что я не могу догадаться о 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.

  • 0
    Смешивание && и || во-первых, else if могут быть проблемы. Попробуйте проверить каждую цифру в отдельном утверждении или вложить их.
Теги:
user-input

7 ответов

-1
Лучший ответ

Я думаю, что проблема в том, что вы не учитываете повторные цифры. Вы можете проверить, чтобы все цифры добавлялись к номеру примера, то есть:

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

Используя этот код:

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

Я не знаю, разрешит ли это все ваши проблемы, но это начало, и оно должно решить вашу немедленную проблему с помощью значения "110". Удачи!

  • 0
    цифры могут быть 0-9
  • 1
    Суммирование цифр не сработает, это приведет к ряду коллизий. Например, если лотерея 456 предположение 178 будет соответствовать правилу 2.
Показать ещё 2 комментария
0

я думаю, что знаю это, возможно, потому, что 110 верно в правиле2, а также в rule3, поэтому он отображает вывод обоих правил. это мое логическое выражение для правила 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))

все возможно ответ есть.

0

Как упомянуто @dimo414 (и другие ответы), вам нужна какая-то память, для которой вы проверяете цифры. Следующие условия дадут вам перестановки, которые вы ищете. Если matched1, matched2 или matched3 являются -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");
            }
        }
    }
 }

Это сначала проверяет, является ли первая цифра вашей догадки первой цифрой лотереи. Если это так, он сохраняет соответствие 1 (для цифры вашего предположения) со значением 1 (для первой цифры в лотерее). Затем он проверяет вторую угаданную цифру по сравнению с цифрами 2 и 3 лотереи. Мы не проверяем вторую цифру вашей догадки с первой цифрой лотереи снова здесь, потому что мы уже знаем, что первое предположение совпало с первой лотереей. Если первая цифра не соответствует первому номеру лотереи, мы видим, является ли первая цифра угадывания второй цифрой номера лотереи, а затем промыть и повторить. (Если бы это было так, то совпадение1 было бы 2 для второй цифры лотереи.)

Все совпадающие значения (совпадающие1, согласованные2, согласованные3) являются (1,2,3), (1,3,2), (2,1,3), (2,3,1), (3,1,2 ) и (3,2,1). Вы можете видеть, как все эти перестановки охватываются вложенных операциях if выше.

  • 0
    В вашем примере угадывания 110 против лотереи 100 вы получите ( matched1 , matched2 , matched3 ) как (1, -1, -1).
0

Ваше условие для правила 2 неверно; он в настоящее время говорит (в псевдокоде):

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

Это явно не то, что вы ищете, так как это означает, что несколько цифр угадывания могут совпадать с одной и той же лотерейной цифрой, так как вы столкнулись с 110 подходящими 100 - поскольку 1 и 0 оба находятся в выигрышном номере, он проходит даже хотя это не должно.

Вместо этого вы хотите сопоставить каждую цифру с остальными цифрами. "Правильный" способ сделать это будет с помощью Set, но похоже, что вы еще не можете их использовать. Вы можете сделать это вручную, это всего лишь небольшая работа, чтобы выписать все случаи. В принципе, вы сравниваете одну цифру предположения с одной цифрой в лотерею, а затем сравниваете оставшиеся две цифры до двух оставшихся двух лотерейных цифр. Повторите промывку для каждой цифры.

  • 0
    ... и ты ударил гвоздь по голове! - по крайней мере, так, чтобы я мог это понять. Я вижу, что он это делает, но я подумал, что это необходимо, потому что мне нужен матч, несмотря ни на что.
  • 0
    Неважно. Я потерял понимание этого. 1 == 1, 2 == 3, 3 == 2. Я стараюсь изо всех сил визуализировать это.
Показать ещё 5 комментариев
0

проблема здесь в том, что у вас есть дубликаты, поэтому текущее условие для правила 2 оценивается как true для 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;
}
  • 1
    Этот тип кодирования ... я еще не видел.
  • 0
    @ChrisRedfieldea Я не уверен, что вы имеете в виду под "типом кодирования" здесь, это просто идея, как вы можете сравнить цифры 2 чисел с одинаковыми наборами без использования массивов / наборов / явной сортировки
Показать ещё 2 комментария
0

Ваша проблема в том, что вы проверяете каждую цифру догадки с каждой цифрой в лотерею. Именно по этой причине вы получаете ошибку, вам нужно помнить, что вы сопоставили. Очень быстрое и грязное решение, чтобы сделать это, - проверить двойники и заменить их значением, которое никогда не будет согласовано, например -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, потому что вам нужно создать еще 2 ifs для guessDigit1 == lotteryDigit1 и guessDigit3 == lotteryDigit1.

-1

Вместо этого вы хотите сопоставить каждую цифру с остальными цифрами. "Правильный" способ сделать это будет с помощью 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");

Это все, с чем я могу работать - никаких других формул. Программа, используемая для включения моего кода, очень специфична для ввода. Он примет только то, что было принято для принятия.

  • 0
    Мне все равно, если я буду отмечен вниз. Я стараюсь изо всех сил, чтобы понять это. Я не вижу, что я делаю неправильно. Я прошел через все комбинации, которые я могу понять ...
  • 0
    Подумайте о 567 и 765, вы не можете проверить только разные позиции.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню