terça-feira, 19 de dezembro de 2017

Problema dos ternos possíveis


Compartilhe!

O objetivo do programa em C abaixo é calcular todos os ternos possíveis dado um valor a, que refere-se ao valor de um dos catetos do triângulo retângulo. A ideia é utilizar laços encaixados.

#include <stdio.h>

int main() {

    int a, b, c, aux, achou = 0, k, incremento, resultado, x, y; //Variáveis a serem utilizadas.
    b = 0;

    scanf("%d", & a); //Entrada do valor a (mas que no triângulo pode ser tanto o cateto a (ímpar) quanto o cateto b (par).
    
    if (a < 1001) { //Condição para futuro valor de c.
        if (a % 2 == 0) //Definindo qual dos catetos é a. Se o cateto par ou o cateto ímpar. 
        aux = 1;
        else aux = 2;

        for (int i = 0; c < 1001; i++) { //Laço com condição de c ser até 1000.
            b += aux; //Incrementa em b o menor valor possível do cateto.
            //Encontrar a raiz de (a*a+b*b)
            x = ((a * a) + (b * b));
            y = 2; //Índice da raiz.
            k = 1;
            incremento = 1;
            for (float l = 1; l <= x; l = l + incremento) //O incremento será um número inteiro para que o resultado possa também o ser.
            {
                for (int j = 0; j < y; j++) {
                    k = k * l;
                }
                if (x < k) {
                    resultado = (l - incremento);
                    break;
                } else k = 1;
            }

            c = resultado;

            //Encontrar a raiz de (c*c)-(b*b)
            x = (c * c) - (b * b);
            y = 2; //Índice da raiz.
            k = 1;
            incremento = 1;
            for (float l = 1; l <= x; l = l + incremento) //O incremento será um número inteiro para que o resultado possa também o ser.
            {
                for (int j = 0; j < y; j++) {
                    k = k * l;
                }
                if (x < k) {
                    resultado = (l - incremento); //resultado será raiz((c*c)-(b*b).
                    break;
                } else k = 1;
            }

            if (a == resultado) { //Verifica se valor c e b satisfazem a com a resultado da raiz, onde eles aparecem.
                printf("(%d, %d, %d)\n", a, b, c); //Caso sim, imprime resultado e registra que um resultado ao menos foi encontrado.
                achou = 1;
            }
        }

    } else { //Caso a seja maior que 1000, impossível encontrar valor para c que este seja menor que 1000. (Na verdade 1000 é muito, a poderia ser menor que não encontraríamos valor para c menor que 1000.)
        printf("-\n");

    }

    if (!achou) //Se não encontrou nenhum terno:
    printf("-\n");

    return 0;
}