396 подписчиков

Решение 6 задачи проекта Эйлера: Разность между квадратом суммы и суммой квадратов

434 прочитали

Задачу решил буквально так, как описано в задании. Как бонус, в статье описал особенности использования арифметической операции += в программах.

Условия задачи

"Сумма квадратов первых десяти натуральных чисел равна

1^2 + 2^2 + ... + 10^2 = 385

Квадрат суммы первых десяти натуральных чисел равен

(1 + 2 + ... + 10)^2 = 55^2 = 3025

Следовательно, разность между суммой квадратов и квадратом суммы первых десяти натуральных чисел составляет 3025 − 385 = 2640.

Найдите разность между суммой квадратов и квадратом суммы первых ста натуральных чисел."

Сама программа

Решаем 6 задачу Эйлера
Решаем 6 задачу Эйлера

Сама программа по сути повторяет задание. Создано три переменных:

  • answer - для сохранения ответа;
  • sum_num - для хранения промежуточных данных при вычислении суммы квадратов;
  • sq_sum - используем при вычислении квадрата суммы;

В цикле перебираем натуральные числа от 1 до 100 включительно. При этом в одну переменную добавляем эти числа, а в другую - квадраты этих чисел, после чего находим искомую разность.

Особенности использования арифметической операции +=

В программе использовал такой вид выражения:

sum_sum += i;

....а не такой:

sq_sum = sq_sum + i;

...не просто потому что мне лень писать название переменной два раза.

Дело в том, что при использовании конструкции:

<выражение 1> = <выражение1> + 1;

<Выражение 1> (переменная, возвращаемое значение функции и т.п) справа и слева от знака "=" могут занимать разные участки в памяти компьютера (зависит от компилятора) и даже - иметь разное значение.

Например, в программе используется функция get_ind(), возвращающая некоторое значение и пишется следующее выражение:

ar[get_ind()] = ar[get_ind()] + 1; //хотим увеличить значение элемента массива на единицу

Функция get_ind() здесь вызывается два раза и может вернуть разные значения и таким образом из массива ar[] будут вызваны разные индексы с разными значениями и получим мы не то, что ожидали.

Это язык C! Он уникален))
Это язык C! Он уникален))

При использовании арифметической операции += таких проблем нет. Она гарантирует работу с одной и той же ячейкой памяти.

ar[get_ind()] += 1; //меняем значение элемента массива без всяких сюрпризов

Результаты вычислений

Запустил программу несколько раз, решает стабильно быстро, около 0.4 секунд.

Ответ на задачу:

P.S. Изначальная цель блога - получить "фидбек" в комментариях, чтобы более опытные "кодеры" указывали мне на ошибки, советовали и всячески помогали в саморазвитии.

Также приглашаю всех на мой сайт)

На нем Вы можете посмотреть ответ на задачу Эйлера #6 (когда необходима лишь небольшая подсказка) и последний, самый быстрый вариант решения.

Советую все-таки подписаться)
Советую все-таки подписаться)

В общем, добро пожаловать на канал))