|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.03.2016, 16:43 | #1 |
Регистрация: 09.04.2015
Сообщений: 9
|
Оптимизация программы на Си
Условие:
Дана последовательность из N (1 ≤ N ≤ 100000) целых чисел и число K (|K| ≤ 100000). Сдвинуть всю последовательность (сдвиг - циклический) на |K| элементов вправо, если K – положительное и влево, если отрицательное. Входные данные В первой строке дано натуральное число N, во второй строке N целых чисел, а в последней целое число K. Все числа во входных данных не превышают 109. Выходные данные Требуется вывести полученную последовательность. Примеры входные данные 5 5 3 7 4 6 3 выходные данные 7 4 6 5 3 Код:
|
14.03.2016, 17:53 | #2 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,316
|
Если реальный сдвиг производить не нужно, то после считывания всех данных можно вывести ответ:
Код:
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
Последний раз редактировалось BDA; 14.03.2016 в 17:55. |
14.03.2016, 21:26 | #3 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
Возможно будет хуже и медленней, а может через связные списки будет быстрее работать?
|
14.03.2016, 23:48 | #4 | |
Регистрация: 09.04.2015
Сообщений: 9
|
Цитата:
|
|
15.03.2016, 00:05 | #5 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,316
|
Имеем желаемый сдвиг K. Если K больше N, то каждые N сдвигов массив будет возвращаться в исходное положение, так что сразу рассмотрим только сдвиг на K%N. Сдвиг в одну сторону на K аналогичен сдвигу в другую сторону на N-K. Поэтому рассматриваю сдвиг N+K%N. Этот сдвиг опять может быть больше N, так что (N+K%N)%N. Поскольку я только вывожу массив с определенного места, то мне нужно найти место, с которого выводить массив. Если сдвиг производится вправо, то место вывода левее начала массива и наоборот, поэтому формула (N-K%N)%N.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
|
15.03.2016, 15:09 | #6 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
|
15.03.2016, 15:17 | #7 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
Но есть задумка, по поводу того, как использовать два массива. Если конечно условия позволяют.
Один массив содержит элементы, которые даются по заданию. Второй хранит в себе номера элементов первого массива. И когда ты сдвигаешь элементы вправо или влево, сам массив ты не трогаешь, а лишь поэлементно добавляешь число сдвигов во второй массив. Ну и конечно же, если сумма превышает число элементов первого массива, то просто откидывать количество элементов массива. По идее должно работать быстрее, чем приведенный вами код, но не факт, что быстрее чем код приведенный BDA. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Оптимизация программы | vladis222 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 3 | 14.11.2013 13:49 |
Оптимизация программы на С++ | programka311 | Помощь студентам | 10 | 21.03.2013 14:29 |
Оптимизация программы | danil123 | Общие вопросы Delphi | 8 | 20.01.2013 19:34 |
Оптимизация программы | Семоха Валерий | Помощь студентам | 1 | 26.05.2012 14:04 |
оптимизация программы | Arsenx777 | Работа с сетью в Delphi | 1 | 28.08.2011 14:00 |