Java программа для решения простой криптарифметической головоломки
Редактировать: моя программа работает сейчас, но мне все еще нужно кое-что прояснить для части "else if (400*T + 40*O + 4*O == 1000*G + 100*O + 10*O + D)", которая является ключом к решению головоломки. Я просто хочу полностью понять каждую часть программы, спасибо.
Это только для ознакомления, и я потратил пару часов, пытаясь понять это. Я либо получаю все нули для переменных, либо это бесконечный цикл. Вот вопрос, как написано в книге:
"В криптарифметических головоломках математические уравнения пишутся с использованием букв. Каждая буква может быть цифрой от 0 до 9, но никакие две буквы не могут быть одинаковыми. Вот пример задачи: ОТПРАВИТЬ + БОЛЬШЕ = ДЕНЬГИ Решение головоломки - S = 9, R = 8, O = 0, M = 1, Y = 2, E = 5, N = 6, D = 7. Напишите программу, которая найдет решение криптарифметической головоломки следующего: TOO + TOO + TOO + TOO = GOOD Самый простой метод - использовать вложенные циклы для каждой уникальной буквы (в данном случае T, O, G, D). Циклы будут систематически присваивать цифры от 0 до 9 каждой букве. Например,itmightfirsttryT=0,O=0,G=0,D=0, затем T=0,O=0, G = 0, D = 1, затем T = 0, O = 0, G = 0, D = 2 и т. Д., до T = 9, O = 9, G = 9, D = 9. В теле цикла проверьте, что каждая переменная уникальна и уравнение выполнено. Выведите значения для букв, которые удовлетворяют уравнению."
public class PracticeProjectEight
{
public static void main(String[] args)
{
int T = 0 , O = 0 , G = 0 , D = 0;
boolean keepGoing = true;
//boolean againT = true , againO = true , againG = true , againD = true ;
// while (keepGoing)
//{
for (T = 0 ; T > 10 ; T++)
{
for (O = 0 ; O > 10 ; O++)
{
for (G = 0 ; G > 10 ; G++)
{
for (D = 0 ; D > 10 ; D++)
{
if ((D == G) || (D == O) || (D == T) || (G == O) || (G == T) || (O == T))
{
//keepGoing = true;
continue;
}
else if (400*T + 40*O + 4*O == 1000*G + 100*O + 10*O + D)
{
//keepGoing = false;
System.out.println("T = " + T);
System.out.println("O = " + O);
System.out.println("G = " + G);
System.out.println("D = " + D);
System.exit(0);
}
}
}
}
}
//}
}
}
Как видите, я попытался поместить все циклы for в цикл while, чтобы контролировать все как одну из моих многочисленных попыток исправить. Это не сработало (вообще), поэтому я закомментировал это.
2 ответа
Все из тех >
с должно быть <
s. Ты хочешь < 10
не > 10
,
Другими словами, это должно быть:
for (T = 0; T < 10; T++) {
for (O = 0; O < 10; O++) {
for (G = 0; G < 10; G++) {
for (D = 0; D < 10; D++) {
// your logic as before
}
}
}
}
Я здесь новичок и новичок в программировании в целом. Но я тоже работаю над Абсолютной Явой и только что решил эту проблему.
Я не запускал ваш код, но, на первый взгляд, кажется, что есть некоторые проблемы.
(Или, возможно, я ошибаюсь. Смотрите сами. Я просто дам вам знать, что я думаю здесь.)
Во-первых, то, как вы это структурировали, казалось бы, не позволяет вам находить НЕСКОЛЬКО решений проблемы. Вы говорите системе выйти, когда решение достигнуто, не так ли? Или я недоразумение?
Во-вторых, вы говорите программе "продолжить", если встречается решение, в котором две переменные соответствуют одной и той же цифре, но вы не говорите программе НЕ СЧИТАТЬ эти решения, что, как мне кажется, является проблемой программирования. просил.
В-третьих, я даже не уверен, какую роль играет "продолжать идти". Вложенность циклов гарантирует - я думаю - что все возможности / перестановки реализованы / рассмотрены этим пунктом в кодировании, не так ли? Так какой смысл в булевом условии?
Я допускаю возможность того, что я далеко от базы во всем этом. Я программировал только 3 недели. Но вот мой код (извините, так небрежно).
(Кроме того, вы увидите, что я добавил туда "счетчик", чтобы подсчитать неудачную комбинацию / назначение. Но и в этом я могу быть сбит с толку. Опять же, извините, если мои комментарии здесь удалены.)
public static void main(String[] args) {
int count = 0;
for (int G = 0; G <=9; G++)
{
for (int O = 0; O <=9; O++)
for (int T = 0; T <=9; T++)
for (int D = 0; D <=9; D++)
if (((G != O) && (G != T) && (G != D) &&
(O != T) && (O != D) && (T != D))
&&
((400 *T) + (40 * O) + (4*O)) ==
((1000*G) + (100*O) + (10*O) + (1*D)))
{
System.out.println("G = " + G + "," + " O = " + O + "," +
"T = " + T + "," + "D = " + D);
}
else count = count +1;
}
System.out.println(count);