tenho um exercício que me deparei, e nao estou conseguindo começar, gostaria que alguem me ajudasse com a lógica do exercício, o exercício é o seguinte:
Escreva um programa para resolver o seguinte problema: em um quartel, um coronel quer
montar uma apresentação, demonstrando a disciplina e organização de seus soldados. Para
tanto ele quer distribuir seus soldados em filas, tal que o número da fila represente a
quantidade de soldados, ou seja, fila 1, 1 soldado, fila 2, 2 soldados e assim por diante. A
última fila deverá ter a quantidade restante dos soldados. Sua missão é criar um programa
para ler a quantidade de soldados do quartel e por fim, gerar a distribuição dos soldados
em filas. Para isso utilize um vetor de Strings e acumule em cada posição uma fila (posição
[0], fila 1, 1 soldado; posição [1], fila 2, 2 soldados; posição[2], fila 3, 3 soldados; …;
posição [n-1], fila n, soldados restantes). O programa deve ser executado até o usuário
digitar zero. Entradas negativas devem gerar mensagem de erro e solicitar nova entrada
válida. Ao final de cada distribuição em filas, apresentar a quantidade de soldados, a
quantidade de filas e a quantidade de soldados na última fila.
Nestes termos, é uma progressão aritimética.
Você tem:
-> a1 = 1; //primeiro termo da P.A.
-> r = 1; //razão
-> n = ? //quantidade de termos
-> an = ? //ultimo termo da P.A.
-> S = total de soldados;//soma dos números
S = ((a1+an)n)/2
logo:
S = ((1 + an)n) / 2)
an = a1 + (n-1) * r
logo:
an = 1 + (n-1) * 1
an = 1 + n - 1
an = n -> o ultimo termo da P.A = quantidade de termos da P.A.
Assim, a função S (soma) pode ser reescrita da seguinte forma:
S = ((1 + an)n )/ 2
S = (1 + n) * n/ 2
2S = (1 + n) * n
2S = n + n²
n² + n - 2S = 0;
Como a variável S é total de soldados, falta descobrir apenas n.
Lembrar que:
xFilas = (-b ± raiz(b² -4ac) / 2a)
Como conhecemos que a = 1, b = 1 e c = -2S, o método é escrito da seguinte forma:
public double totalFilas(int totalSoldados){
return (-1 + Math.sqrt( 1 + 8 * totalSoldados))/2.0;
}
Se o retorno da função não for equivalente a um número inteiro, o total de soldados alocados não atende o proposto.
//com este método vc pode testar se a última fila está inteira
public boolean isFilaInteira(double totalFilas){
return Math.floor(totalFilas) == totalFilas;
}
Exemplo:
int soldados = 2;
System.out.println(isFilaInteira(totalFilas(soldados))+": "+totalFilas(soldados));
soldados = 120;
System.out.println(isFilaInteira(totalFilas(soldados))+": "+totalFilas(soldados));
A captura de entradas é outra história.
Pra não perder a viagem:
public static void main(String args[]) {
int totalSoldados = 19;
String[] filas = filas(totalSoldados);
for (int i = 0; i < filas.length; i++) {
if (i + 1 == filas.length) {
filas[i] = totalSoldados + " soldado(s)";
break;
}
filas[i] = (i + 1) + " soldado(s)";
totalSoldados -= i + 1;
}
for (int i = 0; i < filas.length; i++) {
System.out.println("fila[" + (i + 1) + "]" + filas[i]);
}
}
public static double totalFilas(int totalSoldados) {
return (-1 + Math.sqrt(1 + 8 * totalSoldados)) / 2.0;
}
public static boolean isFilaInteira(double totalFilas) {
return Math.floor(totalFilas) == totalFilas;
}
public static String[] filas(int totalSoldados) {
double filas = totalFilas(totalSoldados);
int totalFilas = isFilaInteira(filas) ? (int) filas : (int) filas + 1;
return new String[totalFilas];
}
Dá pra implementar sem usar fórmulas, usando somente o for e decrementando o total de soldados, além de outros passos.
Entendii, obrigado pela ajuda, vou dar uma estudada no algoritmo