идеальная боковая комбинация прямоугольного треугольника - PullRequest
0 голосов
/ 22 марта 2011

Я хочу получить список: Стороны прямоугольного треугольника

, которые являются целыми числами (где каждая сторона меньше 100)

Пример:

//I want these combination to be printed 
3, 4, 5
6, 8, 10                    |'.
5, 12, 13               12  |  '.    13   (Figure is just Example)
.                           |    '.
.                           |______'.
.                               5


// I don't want these
1, 1, 1.414....            |'.
.                        1 |  '.    √ˉ2  = 1.414.... (Figure is just Example)
.                          |    '.
                           |______'.
                               1

Обновление:

Мне нравится это: Но это очень тяжелый код (в отношении оптимизации)

for(int i=1;i<100;i++)
{
     for(int j=1;j<100;j++)
     {
         for(int k=1;k<100;k++)
         {
           if(i*i + j*j == k*k)
           { 
                //print i, j, k
           } 
         }         

     }

}

Ответы [ 6 ]

6 голосов
/ 22 марта 2011

То, что вы ищете, это пифагорейские тройки .

3 голосов
/ 22 марта 2011
// Obvious min is 1, obvious max is 99.
for(int i = 1; i != 100; ++i)
{
  // There's no point going beyond the lowest number that gives an answer higher than 100
  int max = 100 * 100 - i * i;
  // There's no point starting lower than our current first side, or we'll repeat results we already found.
  for(int j = i; j * j <= max; ++j)
  {
    // Find the square of the hypotenuse
    int sqr = i * i + j * j;
    // We could have a double and do hyp == Math.Round(hyp), but lets avoid rounding error-based false positives.
    int hyp = (int)Math.Sqrt(sqr);
    if(hyp * hyp == sqr)
    {
      Console.WriteLine(i + ", " + j + ", " + hyp);
      // If we want to e.g. have not just "3, 4, 5" but also "4, 3, 5", then
      // we can also here do
      // Console.WriteLine(j + ", " + i + ", " + hyp);
    }
  }
}
1 голос
/ 22 марта 2011

Я использовал эту формулу в C # для генерации пифагорейских троек в прошлом. Но на этой странице есть много других вариантов.

1 голос
/ 22 марта 2011

Вы можете улучшить свой код, удалив самый внутренний цикл, если воспользуетесь тем, что для каждой пары катетин существует только одно возможное значение для гипотенузы. Вместо того, чтобы искать это значение, вы можете вычислить его, используя теорему Пифагора, и проверить, является ли оно целым числом.

Что-то вроде:

// compute the hypotenuse
var hypotenuse = Math.Sqrt(i*i + j*j);
// test if the hypotenuse is a whole number < 100
if(hypotenuse < 100 && hypotenuse == (int)hypotenuse)
{
     // here's one!
}

Некоторые другие улучшения, которые вы можете сделать:

  • После того, как вы проверили пару катет (x, y), не проверяйте (y, x) снова;
  • Как только вы найдете треугольник (x, y, z), вы можете включить все треугольники с одинаковыми сторонами, умноженные на постоянный коэффициент (k * x, k * y, k * z), т. Е. Если вы найдете ( 3,4,5) вы можете включить (6,8,10), (9,12,15), (12,16,20) и т. Д. (Это может быть слишком много усилий для небольших выигрышей);
0 голосов
/ 25 марта 2011

На декларативном языке (Mathematica):

FindInstance[x^2 + y^2==z^2 &&1<=z<=100 && 1<=y<=x<=100, {x, y, z}, Integers,100]
0 голосов
/ 22 марта 2011

Довольно хороший исчерпывающий поиск:

for(i=1;i<100;i++) {
    k=i;
    for(j=1;k<100;j++) {
        while(i*i+j*j<k*k) {
            k++;
        }
        if(i*i+j*j==k*k) {
            printf("%d %d %d", i, j, k);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...