Possível saída:
5
50
55
500
505
550
555
5000
5005
Possível saída:
5
50
55
500
505
550
555
5000
5005
Pede pro usuário informar quantas casas C ele quer.
Para saber a quantidade Q de números, eleve C ao quadrado.
Crie um array com Q posições.
Faça um for de 1 até Q. Em cada iteração, você cria um dos números.
Ex.:
C=2
Q= 2x2= 4
1 - 00
2 - 05
3 - 50
4 - 55
Ex.:
C=4
Q = 4x4=16
1 - 0000
2 - 0005
3 - 0050
4 - 0055
5 - 0500
6 - 0505
7 - 0550
8 - 0555
9 - 5000
10 - 5005
11 - 5050
12 - 5055
13 - 5500
14 - 5505
15 - 5550
16 - 5555
Escrevi todas as posições para você perceber o padrão.
Acredito que pode fazer pelo princípio de análise combinatória.
Tenta fazer e posta aqui, para ajudarmos.
Não ficou claro pra mim os padrões.
Criei algumas ideias, mas todas me pareceram “longas” demais para um problema que, apesar de não conseguir resolver, parece simples.
Há alguma dica? Se vou precisar usar multiplicação, ou multiplicação e soma, ou converter em String
para manipular visualmente a ordem com substring
? Eu realmente não consegui ver uma solução prática.
Conte aí quais as ideias. De repente podem ser melhores do que o que pensei.
Mantendo o princípio que C = 4
e o primeiro elemento seria 0005
, por exemplo, poderia passar o número criado de int
para String
(com String.valueOf(num.get(0))
, sendo get(0)
o 0005
e criar novos elementos a partir da manipulação do anterior e fazer o seguinte:
Decrementaria a posição do 5 em 0005
para 0050
, 0500
e assim por diante.
Guardaria esses elementos acima na lista e, para os seguintes, sempre que houvesse zeros após o 5, preencheria com 5.
Exemplo:
0050 » 0055
0500 » 0555
Depois a mesma coisa com 05, 50
, e assim por diante. Mas como eu disse, essas ideias passam longe de algo prático.
Mas resolvem o problema. Então está valendo.
Desde o princípio minha questão era resolver de uma maneira mais prática ou pelo menos ver outras ideias que pudesse “enxugar” para se tornar algo mais simples e maleável. Se puder apresentar o que você pensou, agradeço.
No fundo, parece que o que você quer é calcular o produto cartesiano do array {0, 5}
com ele mesmo várias vezes.
Por exemplo, se for 2 vezes, então o produto cartesiano de {0, 5}
com {0, 5}
será { (0, 0), (0, 5), (5, 0), (5, 5) }
. Se quiser 3 vezes, ficaria { (0, 0, 0), (0, 0, 5), (0, 5, 0), (0, 5, 5) .... (5, 5, 5) }
.
Sabendo o nome do que você precisa (“produto cartesiano”) fica fácil procurar (e pela internet afora vai encontrar trocentas implementações diferentes). Eu adaptei esta aqui, ficou assim:
public static List<List<Integer>> cartesianProduct(List<List<Integer>> lists) {
List<List<Integer>> combinations = Arrays.asList(Arrays.asList());
for (List<Integer> list : lists) {
List<List<Integer>> extraColumnCombinations = new ArrayList<>();
for (List<Integer> combination : combinations) {
for (Integer element : list) {
List<Integer> newCombination = new ArrayList<>(combination);
newCombination.add(element);
extraColumnCombinations.add(newCombination);
}
}
combinations = extraColumnCombinations;
}
return combinations;
}
Aí, basta criar a lista com os dígitos que você quer, e a quantidade de repetições. Por exemplo, para os dígitos 0
e 5
, repetidos 4 vezes:
List<Integer> digitos = Arrays.asList(0, 5); // dígitos possíveis
int qtd = 4; // quantidade de dígitos em cada linha
List<List<Integer>> lists = new ArrayList<>();
for (int i = 0; i < qtd; i++) {
lists.add(digitos);
}
for (List<Integer> list : cartesianProduct(lists)) {
for (Integer i : list) {
System.out.print(i);
}
System.out.println();
}
A saída é:
0000
0005
0050
0055
0500
0505
0550
0555
5000
5005
5050
5055
5500
5505
5550
5555