Пытаемся создать программу, выводящую все возможные комбинации букв AD - PullRequest
3 голосов
/ 10 июля 2020

Я пытаюсь написать программу, которая принимает пользовательский ввод для положительного целого wordLength и перечисляет все возможные варианты расположения заглавных букв wordLength между A и D. Код, который я сейчас использую, должен выводить

AA
AB
AC
AD
BA
BB
BC
BD 

и так далее, когда на входе 2. Тем не менее, вот результат, который я получаю:

AA
AAAB
AAABAC
AAABACAD
AAABACADBA
AAABACADBABB
AAABACADBABBBC
AAABACADBABBBCBD
AAABACADBABBBCBDCA
AAABACADBABBBCBDCACB
AAABACADBABBBCBDCACBCC
AAABACADBABBBCBDCACBCCCD
AAABACADBABBBCBDCACBCCCDDA
AAABACADBABBBCBDCACBCCCDDADB
AAABACADBABBBCBDCACBCCCDDADBDC
AAABACADBABBBCBDCACBCCCDDADBDCDD
AA
AAAB
AAABAC
AAABACAD
AAABACADBA
AAABACADBABB
AAABACADBABBBC
AAABACADBABBBCBD
AAABACADBABBBCBDCA
AAABACADBABBBCBDCACB
AAABACADBABBBCBDCACBCC
AAABACADBABBBCBDCACBCCCD
AAABACADBABBBCBDCACBCCCDDA
AAABACADBABBBCBDCACBCCCDDADB
AAABACADBABBBCBDCACBCCCDDADBDC
AAABACADBABBBCBDCACBCCCDDADBDCDD
AA
AAAB
AAABAC
AAABACAD
AAABACADBA
AAABACADBABB
AAABACADBABBBC
AAABACADBABBBCBD
AAABACADBABBBCBDCA
AAABACADBABBBCBDCACB
AAABACADBABBBCBDCACBCC
AAABACADBABBBCBDCACBCCCD
AAABACADBABBBCBDCACBCCCDDA
AAABACADBABBBCBDCACBCCCDDADB
AAABACADBABBBCBDCACBCCCDDADBDC
AAABACADBABBBCBDCACBCCCDDADBDCDD

Редактировать: мне очень жаль, как выглядит результат, я не могу его получить правильно отформатировать. Код выглядит следующим образом:

import java.util.Scanner;

public class WordGenerator {
    public static void main(String [] args) {
        Scanner scnr = new Scanner(System.in);

        System.out.print("Enter desired 'word' length: ");
        int wordLength = scnr.nextInt();
        System.out.println(wordLength);

        String s = "";
        int i = 0;
        char letter1;
        char letter2;
        char letter3;
        char letter4;

        if (wordLength == 1) {
            letter1 = 'A';
            while (letter1 <= 'D') {
            letter1++;
            s = s + letter1;
            System.out.println(s);
            }   
        }
        else if(wordLength% 2 == 0){
            while (s.length() <= wordLength) {
                letter1 = 'A';
                while (letter1 <= 'D') {
                    letter2 = 'A';
                    while (letter2 <= 'D') {
                        s = s + letter1 + letter2;
                        System.out.println(s);
                        letter2++;
                }
                letter1++;
            }
            wordLength--;
            
            }
        }
            else if(wordLength % 2 != 0) {

                while (s.length() <= wordLength) {
                letter1 = 'A';
                while (letter1 <= 'D') {
                    letter2 = 'A';
                    while (letter2 <= 'D') {
                        s = s + letter1 + letter2;
                        letter2++;
                }
                letter1++;
            }
                letter3 = 'A';
                while (letter3 <= 'D') {
                    letter3++;
                    s = s + letter3;
                    System.out.println(s);
            }   
                
                wordLength--;
            }
        }   
    
}
}

Ответы [ 2 ]

1 голос
/ 10 июля 2020

У вас есть четыре символа, буквы от A до D. Для каждой позиции у вас есть четыре возможных символа. Итак, для слов длины 1 есть 4 комбинации. Для слов длины две комбинации 4*4, для слов длины три комбинации 4*4*4 и так далее. Таким образом, вы ничего не делаете, кроме go через все числа с основанием 4. Только вместо 0,1,2,3 у вас есть A, B, C, D. Чтобы вывести желаемый результат, просто вычислите 4^wordLength и go от 0 до этого результата. Преобразуйте каждое число в этом диапазоне в его представление по основанию 4. Замените 0 на A, 1 на B, 2 на C и 3 на D

import java.util.Scanner;

public class NewClass {
    public static void main(String[] args) {
        Scanner scnr = new Scanner(System.in);

        System.out.print("Enter desired 'word' length: ");
        int wordLength = scnr.nextInt();

        for (int i = 0; i < upperLimit(wordLength); i++){
            String base4 = String.format("%"+wordLength+"s", Integer.toString(i,4)).replace(' ','0');
            String out   = base4.replace('0','A').replace('1','B').replace('2','C').replace('3','D');
            System.out.println(out);
        }
    }

    public static int upperLimit(int x){
        return (int) Math.pow(4, x);
    } 
}
1 голос
/ 10 июля 2020

Замените

 s = s + letter1 + letter2

на

 s = "" + letter1 + letter2

Проблема в том, что вы продолжаете объединять все значения в переменную s, не сбрасывая ее.

Вы Можно также удалить первый, пока l oop while (s.length() <= wordLength) Я не вижу необходимости в нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...