Fila de soldados java

3 respostas
stringvetorjava
gunsdani12

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.

3 Respostas

PedreiroDeSoftware

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));
PedreiroDeSoftware

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.

gunsdani12

Entendii, obrigado pela ajuda, vou dar uma estudada no algoritmo

Criado 11 de dezembro de 2019
Ultima resposta 13 de dez. de 2019
Respostas 3
Participantes 2