2021-06-15 00:49:18 -07:00
---
id: 595b98f8b5a2245e243aa831
2022-02-16 22:48:09 +05:30
title: Triangoli heroniani
2021-06-15 00:49:18 -07:00
challengeType: 5
forumTopicId: 302285
dashedName: heronian-triangles
---
# --description--
2022-02-16 22:48:09 +05:30
La [Formula di Herone ](https://en.wikipedia.org/wiki/Heron's formula "wp: Heron's formula" ) per l'area di un triangolo data la lunghezza dei suoi tre lati `a` `b` , e `c` è data da:
2021-06-15 00:49:18 -07:00
$A = \\sqrt{s(s-a)(s-b)(s-c)},$
2022-02-16 22:48:09 +05:30
dove `s` è la metà del perimetro del triangolo, cioè
2021-06-15 00:49:18 -07:00
$s=\\frac{a+b+c}{2}.$
2022-02-16 22:48:09 +05:30
I triangoli heroniani sono triangoli i cui lati e l'area sono tutti numeri interi.
2021-06-15 00:49:18 -07:00
2022-02-16 22:48:09 +05:30
Un esempio è il triangolo con i lati `3, 4, 5` la cui area è `6` (e il cui perimetro è `12` ).
2021-06-15 00:49:18 -07:00
2022-02-16 22:48:09 +05:30
Si noti che qualsiasi triangolo i cui lati sono tutti un numero intero multiplo di `3, 4, 5` come `6, 8, 10,` sarà anch'esso un triangolo heroniano.
2021-06-15 00:49:18 -07:00
2022-02-16 22:48:09 +05:30
Definisci un triangolo heroniano primitivo come un triangolo eroniano dove il più grande divisore comune
2021-06-15 00:49:18 -07:00
2022-02-16 22:48:09 +05:30
di tutti e tre i lati è `1` (unità).
2021-06-15 00:49:18 -07:00
2022-02-16 22:48:09 +05:30
Ciò escluderà, ad esempio, il triangolo `6, 8, 10.`
2021-06-15 00:49:18 -07:00
# --instructions--
2022-02-16 22:48:09 +05:30
Implementa una funzione basata sulla formula di Herone che restituisce i primi < code > n< / code > triangoli ordinati in un array di array.
2021-06-15 00:49:18 -07:00
# --hints--
2022-02-16 22:48:09 +05:30
`heronianTriangle` dovrebbe essere una funzione.
2021-06-15 00:49:18 -07:00
```js
assert(typeof heronianTriangle === 'function');
```
2022-02-16 22:48:09 +05:30
`heronianTriangle(10)` dovrebbe restituire `[[3, 4, 5], [5, 5, 6], [5, 5, 8], [4, 13, 15], [5, 12, 13], [9, 10, 17], [3, 25, 26], [7, 15, 20], [10, 13, 13], [8, 15, 17]]`
2021-06-15 00:49:18 -07:00
```js
assert.deepEqual(heronianTriangle(testCases[0]), res[0]);
```
2022-02-16 22:48:09 +05:30
`heronianTriangle(15)` dovrebbe restituire `[[3, 4, 5], [5, 5, 6], [5, 5, 8], [4, 13, 15], [5, 12, 13], [9, 10, 17], [3, 25, 26], [7, 15, 20], [10, 13, 13], [8, 15, 17], [13, 13, 24], [6, 25, 29], [11, 13, 20], [5, 29, 30], [13, 14, 15]],`
2021-06-15 00:49:18 -07:00
```js
assert.deepEqual(heronianTriangle(testCases[1]), res[1]);
```
2022-02-16 22:48:09 +05:30
`heronianTriangle(20)` dovrebbe restituire `[[3, 4, 5], [5, 5, 6], [5, 5, 8], [4, 13, 15], [5, 12, 13], [9, 10, 17], [3, 25, 26], [7, 15, 20], [10, 13, 13], [8, 15, 17], [13, 13, 24], [6, 25, 29], [11, 13, 20], [5, 29, 30], [13, 14, 15], [10, 17, 21], [7, 24, 25], [8, 29, 35], [12, 17, 25], [4, 51, 53]],`
2021-06-15 00:49:18 -07:00
```js
assert.deepEqual(heronianTriangle(testCases[2]), res[2]);
```
2022-02-16 22:48:09 +05:30
`heronianTriangle(25)` dovrebbe restituire `[[3, 4, 5], [5, 5, 6], [5, 5, 8], [4, 13, 15], [5, 12, 13], [9, 10, 17], [3, 25, 26], [7, 15, 20], [10, 13, 13], [8, 15, 17], [13, 13, 24], [6, 25, 29], [11, 13, 20], [5, 29, 30], [13, 14, 15], [10, 17, 21], [7, 24, 25], [8, 29, 35], [12, 17, 25], [4, 51, 53], [19, 20, 37],[16, 17, 17], [17, 17, 30], [16, 25, 39], [13, 20, 21]]`
2021-06-15 00:49:18 -07:00
```js
assert.deepEqual(heronianTriangle(testCases[3]), res[3]);
```
# --seed--
## --after-user-code--
```js
const testCases = [10, 15, 20, 25];
const res = [
[[3, 4, 5], [5, 5, 6], [5, 5, 8], [4, 13, 15], [5, 12, 13], [9, 10, 17], [3, 25, 26], [7, 15, 20], [10, 13, 13], [8, 15, 17]],
[[3, 4, 5], [5, 5, 6], [5, 5, 8], [4, 13, 15], [5, 12, 13], [9, 10, 17], [3, 25, 26], [7, 15, 20], [10, 13, 13], [8, 15, 17], [13, 13, 24], [6, 25, 29], [11, 13, 20], [5, 29, 30], [13, 14, 15]],
[[3, 4, 5], [5, 5, 6], [5, 5, 8], [4, 13, 15], [5, 12, 13], [9, 10, 17], [3, 25, 26], [7, 15, 20], [10, 13, 13], [8, 15, 17], [13, 13, 24], [6, 25, 29], [11, 13, 20], [5, 29, 30], [13, 14, 15], [10, 17, 21], [7, 24, 25], [8, 29, 35], [12, 17, 25], [4, 51, 53]],
[[3, 4, 5], [5, 5, 6], [5, 5, 8], [4, 13, 15], [5, 12, 13], [9, 10, 17], [3, 25, 26], [7, 15, 20], [10, 13, 13], [8, 15, 17], [13, 13, 24], [6, 25, 29], [11, 13, 20], [5, 29, 30], [13, 14, 15], [10, 17, 21], [7, 24, 25], [8, 29, 35], [12, 17, 25], [4, 51, 53], [19, 20, 37], [16, 17, 17], [17, 17, 30], [16, 25, 39], [13, 20, 21]]
];
```
## --seed-contents--
```js
function heronianTriangle(n) {
return [];
}
```
# --solutions--
```js
function heronianTriangle(n) {
const list = [];
const result = [];
let j = 0;
for (let c = 1; c < = 200; c++) {
for (let b = 1; b < = c; b++) {
for (let a = 1; a < = b; a++) {
if (gcd(gcd(a, b), c) === 1 & & isHeron(heronArea(a, b, c))) {
list[j++] = new Array(a, b, c, heronArea(a, b, c));
}
}
}
}
sort(list);
for (let i = 0; i < n ; i + + ) {
result[i] = [list[i][0], list[i][1], list[i][2]];
}
return result;
function heronArea(a, b, c) {
const s = (a + b + c) / 2;
return Math.sqrt(s * (s - a) * (s - b) * (s - c));
}
function isHeron(h) { return h % 1 === 0 & & h > 0; }
function gcd(a, b) {
let leftover = 1;
let dividend = a > b ? a : b;
let divisor = a > b ? b : a;
while (leftover !== 0) {
leftover = dividend % divisor;
if (leftover > 0) {
dividend = divisor;
divisor = leftover;
}
}
return divisor;
}
function sort(arg) {
let swapped = true;
let temp = [];
while (swapped) {
swapped = false;
for (let i = 1; i < arg.length ; i + + ) {
if (arg[i][4] < arg [ i - 1 ] [ 4 ] | | arg [ i ] [ 4 ] = = = arg [ i - 1 ] [ 4 ] & & arg [ i ] [ 3 ] < arg [ i - 1 ] [ 3 ] ) {
temp = arg[i];
arg[i] = arg[i - 1];
arg[i - 1] = temp;
swapped = true;
}
}
}
}
}
```