«Нарастающий итог»
Задача:
В массиве А[n] каждый элемент, кроме первого, заменить суммой всех предыдущих элементов.
Вводимые данные | Предполагаемый вывод | Комментарий |
1 1 1 1 1 1 | 1 1 2 3 4 5 | Тест пройден |
1 2 3 4 5 6 7 8 9 | 1 1 3 6 10 15 21 28 36 | Тест пройден |
3 5 2 9 0 4 65 156 1 | 3 3 8 10 19 19 23 88 244 | Тест пройден |
2 -7 3 8 -4 5 -2 4 2 | 2 2 -5 -2 6 2 7 5 9 | Тест пройден |
Исходный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> using namespace std; int main() { int n; //Объявление переменной, обозначающей размерность массива cin >> n; //Ввод величины массива int a[n]; //Создание массива for(int i=0;i<n;i++){ //Ввод значений элементов массива с помощью цикла cin >> a[i]; } int b[n]; //Создание дополнительного массива, в котором и будет храниться результат. int S=0; //Создание вспомогательной переменной b[0]=a[0]; //Инициализация первого элемента второго массива for(int i=1;i<n;i++){ //Преобразование элементов первого массива в элементы второго массива и ввод результата во второй массив S+=a[i-1]; b[i]=S; } for(int i=0;i<n;i++){ cout << b[i] << " "; //Вывод результата } return 0; //Конец } |
Описание:
Постейшие операции с массивом. С помощью цикла записываем данные в массив, после чего, снова с помощью цикла, записываем новые данные во второй массив. Далее выводим результат.
Алгоритм:
- Объявление переменной и ввод размерности массива.
- Создание массива.
- Создание цикла, для записи вводимых данных в массив.
- Создание нового массива.
- Создание цикла, для ввода обработанных данных в новый массив.
- Создание цикла, для вывода результата.
- Окончания работы программы.
Другой вариант:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <iostream> using namespace std; int main() { int n; cin >> n; int a[n]; for(int i=0;i<n;i++){ cin >> a[i]; } int S=0; int i; for(i=0;i<n;i++){ for(int j=0;j<n-i-1;j++){ S+=a[j]; } a[n-i-1]=S; S=0; } a[0]=a[1]; for(int i=0;i<n;i++){ printf(" %d ", a[i]); } return 0; } |
Вариант без использования второго массива. Если действовать в лоб (последовательно менять значения элементов от первого до последнего на сумму предыдущих) можно получить различные геометрические прогрессии и даже, в некоторых случаях, последовательность Фибаначчи(так как мы меняем предшествующие элементы, и, при обычном подходе нет эффективного способа их запоминать). Подумав некоторое время над этой проблемой, и осознав бесперспективность своих действий, решил зайти с другой стороны. Да, я не могу менять элементы в начале массива, но я могу менять их в конце, т. к. они не влияют на вычисления. Для этого пришлось создать новый цикл, в котором мы находим сумму всех элементов массива кроме последнего, величина которого (массива) уменьшается с каждым шагом. Далее, в главном цикле, мы последовательно присваиваем элементам массива найденные суммы. И уже после цикла присваиваем нулевому элементу значение первого.
Что-то Вы перемудрили. Как это элемент может являться своим собственным предыдущим и входить в суму?
Давайте обозначим через b массив после замен. Тогда:
b0 = A0
bi = A0 + A1 + A2 + … + Ai-1
Теперь похоже, что всё правильно. Зачтено.
Правда можно обойтись и без второго массива. Сможете догадаться как? Готов добавить пару баллов за сообразительность.
Простите, что нет комментариев к коду, я попытался описать все детали в тексте под ним.
Забавно получилось. Но я не думал о вложенных циклах. Это все же слишком.
Нужно просто запоминать текущий элемент перед тем как его «портить». Что-то вроде этого:
Зачёл.