Четверг, 02.05.2024, 09:47 | RSS | Приветствую Вас Гость
Главная | Регистрация | Вход
Меню сайта
Категории раздела
Разное [10]
Решения задач (студентам) [9]
PC Игры - кодинг [2]
Python [1]
PHP, Mysql [1]
HTML, CSS, Javascript [1]
Scilab [1]
Поиск
Опрос
Какой браузер вы сейчас используете?
Всего ответов: 51
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » Статьи » Решения задач (студентам)

Представление натурального числа в виде суммы квадратов 2-х чисел
Иногда встречаются задачи, в которых требуется определить, возможно ли представить число в виде суммы квадратов 2-х чисел. Как таковой математической формулы для установления этого факта нет. А потому приходится подбирать нужные числа. Конечно, для небольших чисел подбор возможных вариантов не займет много времени и машинных ресурсов. Но если речь идет о числах, кратных миллиону, то... Не сказать, что при нынешних условиях на такие вычисления уместно жаловаться ,  но, согласитесь, зачем тратить лишние "проценты" ЦП на вычисления, когда их можно использовать еще много для чего (это с учетом того, что расчеты надо делать не для одного числа, а для тех же родимых нескольких миллионов!).

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

Рассмотрим алгоритм на примере. Пусть нам надо выяснить, разлагается число 10 на сумму квадратов 2-х чисел или нет. Чтобы не запутаться введем обозначения.

Пусть:
x - число, которое надо проверить (в нашем случае это 10);
i, j - числа которые при возведении в квадрат и дальнейшем сложении дадут x;
i2= i*i (т. е. i в квадрате);
j2= j*j (т. е. j в квадрате).

Вычисление:
Берем i = 0, тогда i2 = 0, подбираем приемлемое j.
j = 1, j2 = 1. i2 + j2 = 0 + 1 = 1 (<10);
j = 2, j2 = 4. i2 + j2 = 0 + 4 = 4 (<10);
j = 3, j2 = 9. i2 + j2 = 0 + 9 = 9 (<10);
j = 4, j2 = 16 (16 > 10, обрываем перебор по j, т. к. перебирать смысла нет).

Берем i = 1, тогда i2 = 1, подбираем приемлемое j.
j = 1, j2 = 1. i2 + j2 = 1 + 1 = 2 (<10);
j = 2, j2 = 4. i2 + j2 = 1 + 4 = 5 (<10);
j = 3, j2 = 9. i2 + j2 = 1 + 9 = 10 (нужное значение).

Таким образом, 10 можно представить как 1*1 + 3*3 = 10. Так как наша цель узнать первое возможное сочетание, прекращаем вычисление.

Теперь рассмотрим второй случай, когда число нельзя представить в виде суммы квадратов 2-х чисел. Тут стоит заранее отметить, что если  i2 будет больше половины числа, которое раскладываем (т.е. i2 > x/2), то подбирать значения  j далее нет смысла. Именно это и следует взять за второе условие конца перебора значений. Ну и теперь разберем алгоритм на примере числа 7.

Вычисление:
Берем i = 0, тогда i2 = 0, подбираем приемлемое j.
j = 1, j2 = 1. i2 + j2 = 0 + 1 = 1 (<7);
j = 2, j2 = 4. i2 + j2 = 0 + 4 = 4 (<7);
j = 3, j2 = 9. i2 + j2 = 0 + 9 = 9 (>7, обрываем перебор).

Берем i = 1, тогда i2 = 1, подбираем приемлемое j.
j = 1, j2 = 1. i2 + j2 = 1 + 1 = 2 (<7);
j = 2, j2 = 4. i2 + j2 = 1 + 4 = 5 (<7);
j = 3, j2 = 9. i2 + j2 = 1 + 9 = 10 (>7, обрываем перебор).

Берем i = 2, тогда i2 = 4, подбираем приемлемое j.
j = 1, j2 = 1. i2 + j2 = 4 + 1 = 5 (<7);
j = 2, j2 = 4. i2 + j2 = 4 + 4 = 8 (>7, обрываем перебор);

Берем i = 3, тогда i2 = 9 (9 > 7, обрываем вычисления). Таким образом, 7 нельзя представить в виде суммы квадратов.

Теперь запишем этот алгоритм в виде функции.

int twoNumSquare(int x)
{
  int i=0, j=1, c=0, x2;
  while ((c<1) && ((i*i)<= (x/2))) // здесь c - признак того, найден ответ или нет (1 - да, 0 - нет)
  {
    while ((i*i+j*j) < x) // пока сумма квадратов меньше нужного числа
    {
      c= 0; // не правильный вариант
      j++;
    }
    if ((i*i+j*j) == x) c= 1; // если сумма квадратов = нужному числу, то вариант верен (c=1)
    if ((i*i+j*j) > x) c= 0; // если сумма квадратов больше нужного числа, то вариант не верен
    i++;
    j=1; // возвращаем j (второе число) в первоначальное положение (!)
  }
  return(c); // возвращаем результат 1 или 0
}

А дальше после использования функции интерпретируете полученный 1 или 0 во что Вам удобно.

P.S. Замечания и предложения по этой функции, а так же обнаруженные баги описывайте в комментариях.
Поделиться ссылкой в соц. сетях:

Категория: Решения задач (студентам) | Добавил: =Sanek= (28.03.2011)
Просмотров: 4233 | Теги: студентам, программирование | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

© 2024 raznocoding.do.am