Cómo encontrar una lista total de todos los triángulos con un perímetro dado (longitudes de los lados enteros) a mano

Hay 2 criterios que debe verificar:

  1. [matemáticas] A + B + C = P, [/ matemáticas] por lo que [matemáticas] P [/ matemáticas] es el perímetro
  2. [matemáticas] A <B + C, B <A + C, C <A + B [/ matemáticas]

Sin perder la generalidad, dejemos [math] A \ leq B \ leq C [/ math].

Sabemos que [matemáticas] 3A \ leq A + B + C = P [/ matemáticas], por lo tanto, [matemáticas] A \ leq P / 3 [/ matemáticas]. Nuestra iteración debe ir desde [matemáticas] A = 1 [/ matemáticas] hasta [matemáticas] A> P / 3 [/ matemáticas].

A continuación, necesitamos saber el rango de [matemáticas] B [/ matemáticas] para cada valor de [matemáticas] A [/ matemáticas]. Usando la desigualdad triangular,

[matemáticas] A + B> C = PAB [/ matemáticas]

[matemáticas] 2B> P-2A [/ matemáticas]

[matemáticas] B> \ frac {P-2A} {2} [/ matemáticas]

[matemáticas] B_ {min} = \ left \ lfloor {\ frac {P-2A} {2} +1} \ right \ rfloor [/ math]

Después de hacer algunas matemáticas, mi enfoque será

  1. Valor fijo de A a 1
  2. Comience por [math] B = \ left \ lfloor {\ frac {P-2A} {2} +1} \ right \ rfloor [/ math]. Si [matemáticas] B <A [/ matemáticas], deje que [matemáticas] B = A [/ matemáticas]. Obtenga el valor correspondiente de [matemáticas] C [/ matemáticas].
  3. Mantenga aumentar el valor de [matemática] B [/ matemática] en 1 y disminuya el valor de [matemática] C [/ matemática] en 1 hasta que [matemática] C <B [/ matemática]
  4. Incrementar [matemáticas] A [/ matemáticas] en 1.
  5. Si [matemáticas] A> P / 3 [/ matemáticas], ya está; De lo contrario, regrese al paso 2.

Probé mi algoritmo con C ++, aquí está mi código:

#include
#include

usando el espacio de nombres estándar;

int main () {
perímetro int, a, b, c;
cout << "Ingrese el perímetro del triángulo:";
cin >> perímetro; // El usuario es agradable y soy flojo para verificar la entrada

para (a = 1; a <= perímetro / 3; ++ a) {
// el piso no es necesario si haces división entera usando 2 en lugar de 2.0
b = piso ((perímetro – a * 2) /2.0 + 1);
si (b <a)
b = a; // de lo contrario obtendrás permutación del conjunto anterior
c = perímetro – a – b;
mientras que (c> = b) {
cout << "(" << a << "," << b << "," << c << ")" << endl;
b ++;
C-;
}
}

devuelve 0;
}

Hagamos un seguimiento manual para ver cómo funciona este algoritmo.

Digamos que el perímetro es 20.

Comience desde [matemáticas] A = 1 [/ matemáticas].

[matemática] B = \ floor {\ frac {P-2A} {2} +1} = 10 [/ matemática], [matemática] C = 20-1-10 = 9 <B [/ matemática], sin solución entera para [matemáticas] A = 1 [/ matemáticas].

[matemáticas] A = 2 [/ matemáticas]

[matemática] B = 9 [/ matemática], [matemática] C = 20-2-9 = 9 [/ matemática], [matemática] \ fbox {(2,9,9)} [/ matemática]

Incremente [matemática] B [/ matemática] y disminuya [matemática] C [/ matemática] y encuentre que [matemática] C <B [/ matemática].

[matemáticas] A = 3 [/ matemáticas]

[matemáticas] B = 8, C = 9, \ fbox {(3,8,9)} [/ matemáticas]

Incremente [matemática] B [/ matemática] y disminuya [matemática] C [/ matemática] y encuentre que [matemática] C <B [/ matemática].

[matemáticas] A = 4 [/ matemáticas]

[matemáticas] B = 7, C = 9, \ fbox {(4,7,9)} [/ matemáticas]

Incremento [matemática] B [/ matemática] y decremento [matemática] C [/ matemática], [matemática] \ fbox {(4,8,8)} [/ matemática]

Incremente [matemática] B [/ matemática] y disminuya [matemática] C [/ matemática], y encuentre que [matemática] C <B [/ matemática]

[matemáticas] A = 5 [/ matemáticas]

[matemáticas] B = 6, C = 9, \ fbox {(5,6,9)} [/ matemáticas]

Incremento [matemático] B [/ matemático] y decremento [matemático] C [/ matemático], [matemático] \ fbox {(5,7,8)} [/ matemático]

Incremente [matemática] B [/ matemática] y disminuya [matemática] C [/ matemática], y encuentre que [matemática] C <B [/ matemática]

[matemáticas] A = 6 [/ matemáticas]

[matemáticas] B = 5 [/ matemáticas]. [matemáticas] B <A [/ matemáticas], deje que [matemáticas] B = A = 6, C = 8, \ fbox {(6,6,8)} [/ matemáticas]

Incremento [matemática] B [/ matemática] y decremento [matemática] C [/ matemática], [matemática] \ fbox {(6,7,7)} [/ matemática]

Incremente [matemática] B [/ matemática] y disminuya [matemática] C [/ matemática], y encuentre que [matemática] C <B [/ matemática]

[matemáticas] A = 7> 20/3 [/ matemáticas], hemos terminado.

Los lados del triángulo son a, b, c . Seguramente a, b, c> 0 (cero)
Obviamente, se debe seguir la regla del triángulo: “La suma de dos lados del triángulo es mayor que el tercer lado.

Entonces, podemos seguir el siguiente pseudocódigo, ya que la verificación manual seguramente costará mucho tiempo.

cuenta = 0; // realiza un seguimiento del total no. de soluciones

para (a = 1 a 11) {// los rangos se pueden optimizar
para (b = a a 11) {
if (a + b> = 11) {
rotura; // sin solución
}

c = 11 – (a + b);

si (c
rotura; // sin solución
}

if (a + b> c && a + c> b && b + c> a) {
imprimir (a, b, c); // solución
recuento ++;
}
}
}

Total 4 triángulos con perímetro 11 .
# 1 (1 5 5)
# 2 (2 4 5)
# 3 (3 3 5)
# 4. (3 4 4)

Deje que los lados del triángulo sean [matemática] a, b, c [/ matemática], [matemática] 0 1) Su elección de números debe satisfacer la regla del triángulo, por lo que [math] a + b> c \ Leftrightarrow cb

2) Dado que los números están ordenados de menor a mayor, usted sabe que [matemática] a \ leq \ left \ lfloor {\ frac {d} {3}} \ right \ rfloor [/ math].

3) Si [math] cb [/ math] es par si [math] da [/ math] es par. De lo contrario, es extraño.

Combinando estas observaciones reducirá la pregunta a la siguiente tarea (comenzando con [math] a = 1 [/ math]):
1) Calcular [matemáticas] \ left \ lfloor {\ frac {d} {3}} \ right \ rfloor [/ math];
2) Enumere los números 0 hasta [matemáticas] a-1 [/ matemáticas];
3) Filtre valores impares si [math] da [/ math] es par; de lo contrario, filtre valores pares.
4) Para estos valores (llamémoslos [matemática] r [/ matemática]), calcule [matemática] b = \ frac {dar} {2} [/ matemática] y [matemática] c = \ frac {d-a + r} {2} [/ matemáticas].
5) Si [math] a [/ math] no ha alcanzado el valor [math] \ left \ lfloor {\ frac {d} {3}} \ right \ rfloor [/ math], increméntelo en 1 y repita los pasos 2 a 5.

Para este ejemplo:
[matemáticas] \ left \ lfloor {\ frac {d} {3}} \ right \ rfloor = 3. [/ math]
[matemática] a = 1 [/ matemática], así que verifique hasta [matemática] a-1 = 0 [/ matemática] para números pares ([matemática] a, d [/ matemática] impar). Solo 0 califica.
Esto da [matemáticas] b = c = \ frac {11-1} {2} = 5 [/ matemáticas].

[matemáticas] a = 2 [/ matemáticas], marque hasta 1 para números impares. Solo 1 califica.
Esto da [matemática] b = \ frac {11-2-1} {2} = 4 [/ matemática], [matemática] c = \ frac {11-2 + 1} {2} = 6 [/ matemática].

[matemáticas] a = 3 [/ matemáticas], 0 y 2 califican.
Esto da [matemáticas] b = c = 4 [/ matemáticas] o [matemáticas] b = 3 [/ matemáticas], [matemáticas] c = 5 [/ matemáticas].