Все треугольники Герона на Javascript
Ещё одна мини-программка, на этот раз мы ищем возможные героновы треугольники, то есть, такие, у которых и стороны, и периметр, и площадь - целые числа. Один геронов треугольник со сторонами 3, 4 и 5, обычно знают все :)
Если ограничить проверяемый верхний размер стороны значением 500, будет найдено более 2000 треугольников Герона:
Выполнить скрипт онлайн (может понадобиться несколько секунд, если комп медленный)
heroniantriangles.html (2 Кб)
Памятки этого кода такие:
- перебрать возможные натуральные стороны треугольников можно в таком тройном цикле:
for (c=1; c<=n; c++) for (b=1; b<=c; b++) for (a=1; a<=b; a++) { //... }
- стандартный метод
sort
так и не удалось заставить нормально сортировать массив массивов, хотя, казалось бы,list.sort ( function (a,b) { return (a[4]>b[4] || a[4]==b[4] && a[3]>b[3]); } );
должно работать нормально. Пришлось написать свой простейший
sort
; - ошибкой было бы писать в блочный элемент (например, в таблицу) прямо в цикле:
for (i = 0; i<len; i++) { document.getElementById('hres').innerHTML += ...; }
Контент может оказаться "после" таблицы. Правильно - накопить контент в переменной (см.
var string
) и потом однократно записать в свойствоinnerHTML
.
Исходник скрипта в момент написания (без HTML-обрамления):
<div id="hres"></div> <script type="text/javascript"> var maxN = 500; //максимальный проверяемый размер стороны function getGeronianTriangles(n) { var list = []; var a,b,c,i; for (c=1; c<=n; c++) for (b=1; b<=c; b++) for (a=1; a<=b; a++) { if( nod(nod(a,b),c)==1 && isInt(heronArea(a, b, c))) list.push (new Array(a, b, c, a + b + c, heronArea(a, b, c))); } sort (list); var len = list.length; var string = '<p>Количество треугольников Герона со стороной до ' + n + ' включительно: ' + len + '</p>' + "\n" + '<table border="1" cellpadding="8" cellspacing="0"><tr><td>Стороны</td><td>Периметр</td><td>Площадь</td></tr>' + "\n"; for (i = 0; i<len; i++) { string += '<tr><td>' + list[i][0] + ' x ' + list[i][1] + ' x ' + list[i][2] + '</td><td>' + list[i][3] + '</td><td>' + list[i][4] + '</td></tr>' + "\n"; } string += '</table>' + "\n"; document.getElementById('hres').innerHTML = string; function heronArea(a, b, c){ var s = (a + b + c)/ 2; return Math.sqrt(s *(s -a)*(s - b)*(s - c)); } function isInt (a) { return a%1 == 0 && a>0; } function nod (a, b){ var mod = 1, max = a > b ? a : b, min = a > b ? b : a; while (mod != 0) { mod = max % min; if (mod > 0){ max = min; min = mod; } } return min; } function sort (list){ var swapped = true; var temp = []; while (swapped) { swapped = false; var i, len = list.length; for (var i = 1; i < len; i++){ if (list[i][4]<list[i-1][4] || list[i][4]==list[i-1][4] && list[i][3]<list[i-1][3]) { temp = list[i]; list[i] = list[i-1]; list[i-1] = temp; swapped = true; } } } } } window.onload = getGeronianTriangles(maxN); </script> <noscript><p>Извините, для работы приложения нужен включённый Javascript</p></noscript>
18.04.2016, 15:45 [5971 просмотр]