БлогNot. Все треугольники Герона на Javascript

Все треугольники Герона на 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 просмотр]


теги: javascript числа

К этой статье пока нет комментариев, Ваш будет первым