Задачу решил буквально так, как описано в задании. Как бонус, в статье описал особенности использования арифметической операции += в программах.
Условия задачи
"Сумма квадратов первых десяти натуральных чисел равна
1^2 + 2^2 + ... + 10^2 = 385
Квадрат суммы первых десяти натуральных чисел равен
(1 + 2 + ... + 10)^2 = 55^2 = 3025
Следовательно, разность между суммой квадратов и квадратом суммы первых десяти натуральных чисел составляет 3025 − 385 = 2640.
Найдите разность между суммой квадратов и квадратом суммы первых ста натуральных чисел."
Сама программа
Сама программа по сути повторяет задание. Создано три переменных:
- 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[] будут вызваны разные индексы с разными значениями и получим мы не то, что ожидали.
При использовании арифметической операции += таких проблем нет. Она гарантирует работу с одной и той же ячейкой памяти.
ar[get_ind()] += 1; //меняем значение элемента массива без всяких сюрпризов
Результаты вычислений
Запустил программу несколько раз, решает стабильно быстро, около 0.4 секунд.
Ответ на задачу:
P.S. Изначальная цель блога - получить "фидбек" в комментариях, чтобы более опытные "кодеры" указывали мне на ошибки, советовали и всячески помогали в саморазвитии.
Также приглашаю всех на мой сайт)
На нем Вы можете посмотреть ответ на задачу Эйлера #6 (когда необходима лишь небольшая подсказка) и последний, самый быстрый вариант решения.
В общем, добро пожаловать на канал))