Создайте лотерею трехзначного числа. Программа предложит пользователю ввести трехзначное число и определит, победит ли пользователь в соответствии со следующими правилами: (ПРАВИЛО 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.
Я думаю, что проблема в том, что вы не учитываете повторные цифры. Вы можете проверить, чтобы все цифры добавлялись к номеру примера, то есть:
1+1+0 = 2
1+0+0 = 1
1!=2
Move onto rule 3.
Используя этот код:
guessDigit1 + guessDigit2 + guessDigit3 == lotteryDigit1 + lotteryDigit2 + lotteryDigit3
Я не знаю, разрешит ли это все ваши проблемы, но это начало, и оно должно решить вашу немедленную проблему с помощью значения "110". Удачи!
456
предположение 178
будет соответствовать правилу 2.
я думаю, что знаю это, возможно, потому, что 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))
все возможно ответ есть.
Как упомянуто @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 выше.
110
против лотереи 100
вы получите ( matched1
, matched2
, matched3
) как (1, -1, -1).
Ваше условие для правила 2 неверно; он в настоящее время говорит (в псевдокоде):
IF guessDigit1 is anyLotteryDigit
AND guessDigit2 is anyLotteryDigit
AND guessDigit3 is anyLotteryDigit
Это явно не то, что вы ищете, так как это означает, что несколько цифр угадывания могут совпадать с одной и той же лотерейной цифрой, так как вы столкнулись с 110
подходящими 100
- поскольку 1
и 0
оба находятся в выигрышном номере, он проходит даже хотя это не должно.
Вместо этого вы хотите сопоставить каждую цифру с остальными цифрами. "Правильный" способ сделать это будет с помощью Set
, но похоже, что вы еще не можете их использовать. Вы можете сделать это вручную, это всего лишь небольшая работа, чтобы выписать все случаи. В принципе, вы сравниваете одну цифру предположения с одной цифрой в лотерею, а затем сравниваете оставшиеся две цифры до двух оставшихся двух лотерейных цифр. Повторите промывку для каждой цифры.
проблема здесь в том, что у вас есть дубликаты, поэтому текущее условие для правила 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:
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.
Вместо этого вы хотите сопоставить каждую цифру с остальными цифрами. "Правильный" способ сделать это будет с помощью 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");
Это все, с чем я могу работать - никаких других формул. Программа, используемая для включения моего кода, очень специфична для ввода. Он примет только то, что было принято для принятия.
&&
и||
во-первых,else if
могут быть проблемы. Попробуйте проверить каждую цифру в отдельном утверждении или вложить их.