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. Например, это может сначала попробовать T = 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, чтобы контролировать все, что было одной из моих многочисленных попыток исправить ситуацию. Это не сработало (совсем), поэтому я прокомментировал это.


person novice9    schedule 27.07.2013    source источник


Ответы (2)


Все эти > должны быть <. Вы хотите < 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
            }
        }
    }
}
person Dennis Meng    schedule 27.07.2013
comment
@ Деннис Мэн Спасибо! Это сделало свое дело и позволило отказаться от оператора continue и просто иметь пустой оператор if. Такая глупая ошибка, которую я совершил и должен был поймать, но я решил, что это правильно, и поискал ошибки в другом месте. Кроме того, кто-нибудь хочет объяснить еще, если (400 * T + 40 * O + 4 * O == 1000 * G + 100 * O + 10 * O + D)? Еще раз спасибо. - person novice9; 27.07.2013
comment
Такое случается. Рад, что смог помочь. - person Dennis Meng; 27.07.2013
comment
else if (400*T + 40*O + 4*O == 1000*G + 100*O + 10*O + D) состоит в том, чтобы на самом деле увидеть, является ли это решением. TOO здесь означает, что T — это цифра сотен, а O — это цифра десятков и единиц, что дает вам 100*T + 10*O + O, и вы умножаете на 4, так как на самом деле вы хотели TOO + TOO + TOO + TOO в левой части. Правая часть выполняется аналогично. - person Dennis Meng; 27.07.2013

Хм, я здесь новенький и вообще новичок в программировании. Но я тоже работаю над Absolute Java и только что решил эту проблему.

Я не запускал ваш код, но на первый взгляд кажется, что есть некоторые проблемы.

(Или, возможно, я ошибаюсь. Смотрите сами. Я просто дам вам знать, что я думаю здесь.)

Во-первых, судя по тому, как вы его структурировали, он не позволит вам обнаружить НЕСКОЛЬКО решений проблемы. Вы говорите системе выйти, когда решение будет найдено, не так ли? Или я неправильно понимаю?

Во-вторых, вы говорите программе «продолжать», если встречается решение, в котором две переменные соответствуют одному и тому же числу, но вы не говорите программе НЕ СЧИТАТЬ эти решения, что, я думаю, и является проблемой программирования. просил.

В-третьих, я даже не уверен, какую роль играет «продолжать». Вложенность циклов гарантирует, я думаю, что все возможности/перестановки реализуются/учитываются в этой точке кодирования, не так ли? Так в чем же смысл логического условия?

Я допускаю вероятность того, что я далеко не прав во всем этом. Программирую всего 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);
person Community    schedule 10.01.2014