Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2016, 15:55   #1
LetsRock
 
Регистрация: 18.08.2014
Сообщений: 8
По умолчанию Восполнить пробелы в знаниях

Добрый день, уважаемые программисты! Хочется задать теоретический вопрос. Решал я задачку на одном известном ресурсе. Задача называется A-B. Два неотрицательных числа, которые не превышают 10^1000 степени. Нужно вычесть одно из другого. Решил я цифры числа хранить в массиве.
Отсюда суть вопроса возникает!
Создал свой тип
Код:
type
  tarr=array[0..1001] of -9..9;
для экономии памяти, как я думал.
Написал код, отправил на проверку и обнаружил, что программа прошла 13 тестов из 15. На 14 завалилась. Целый день я тестил свою программу разными входными данными и даже дважды ее улучшал, но не в том направлении, т.к. 14 тест мне уже в восьмой раз показывал Wrong answer. И тут я просто от безысходности заменил -9..9 на integer и всё! Задача была сдана! Объясните пожалуйста, почему так???? Ведь цифры не превышают диапазон -9..9, что там такое случилось?
И попутно задам второй вопрос, чтобы не засорять форум:
что эффективнее использовать(память/время) для хранения чисел: список или же динамический массив?
Спасибо!
LetsRock вне форума Ответить с цитированием
Старый 19.06.2016, 17:32   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Ведь цифры не превышают диапазон -9..9, что там такое случилось?
в вашем коде, ВОЗМОЖНО, превышало в промежуточных вычислениях.
покажите ваш код.

Но вообще, ваш фокус с -9..9 не мог дать большого выигрыша.
Вы сколько хотели выиграть? 1002 записи Integer в массиве это 4 кибобайта (для 32 битных приложений).
Вы сколько выиграть хотели, 2 килобайта?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.06.2016, 17:34   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
что эффективнее использовать(память/время) для хранения чисел: список или же динамический массив?
задачи разные бывают. в разных задача требуются разные структуры данных.
Чаще всего динамический массив занимает меньше места и более эффективен для прямого доступа к любому элементу.
Но ещё раз повторю - всё зависит от задачи и от используемого алгоритма решения.

Последний раз редактировалось Serge_Bliznykov; 19.06.2016 в 21:24.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.06.2016, 19:40   #4
LetsRock
 
Регистрация: 18.08.2014
Сообщений: 8
По умолчанию

Большое спасибо за ответы
LetsRock вне форума Ответить с цитированием
Старый 19.06.2016, 21:45   #5
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Могли бы человеку указать и на очевидные ляпы:
- отрицательные числа вовсе не стоит хранить в "разрядах"... диапазон сокращаем до 0..9 + храним знак числа рядом
- НЕ эффективно хранить числа в десятичной системе... в лучшем случае, это 1 байт на разряд (эти -9..9 никто не упакует в 5 бит, а сохранит как полный байт, который ещё и "разнесёт" до 4 байт, при типичных настройках и без packed-a)
- если перескочить теорию, то стоит хранить в Word, а вычисления производить в Cardinal....тогда основные операции (сложение, вычитание и умножение) можно реализовать относительно просто, разделяя промежуточный результат простыми mod/div, битовыми операциями или трюками с памятью (читать Cardinal как два Word-а)
- очень стоит почитать теорию про длинную арифметику...... можно реализовать простые операции и "в лоб", но это будет намного менее эффективно, чем специальные алгоритмы
GreenWizard вне форума Ответить с цитированием
Старый 20.06.2016, 07:56   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
- НЕ эффективно хранить числа в десятичной системе... в лучшем случае, это 1 байт на разряд (эти -9..9 никто не упакует в 5 бит, а сохранит как полный байт, который ещё и "разнесёт" до 4 байт, при типичных настройках и без packed-a)
Это сложней для понимания и составления алгоритма. Если человек только разбирается, пусть сначала разряд в байте хранит.
Цитата:
можно реализовать простые операции и "в лоб", но это будет намного менее эффективно, чем специальные алгоритмы
Ему нужна всего одна операция. Школьный столбик будет вполне эффективен, особенно если подумать. Если ему нужны другие операции, то да, деление и умножение через специальные алгоритмы намного эффективней. А для сложения-вычитания слишком муторно для простых задач. Проще столбик мутить и не париться.
Я бы так делал:
Код:
type
   BigNum = record
       Sign: Word;                     // Знак числа (можно Boolean, но вроде как Word быстрей)
       Digit: Array of Byte;           // Разряды 
   end;
Если потом станет интересно, запись можно расширить, введением позиции дробной части. В данном случае мы не ограничиваемся 1000-й степенью, универсализм.
Цитата:
тогда основные операции (сложение, вычитание и умножение)
А где деление? Почему все в длинной арифметике тщательно избегают операции деления?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 20.06.2016 в 08:07.
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Пробелы. minimesqa Паскаль, Turbo Pascal, PascalABC.NET 4 12.04.2013 19:13
пробелы :( Odyssey C# (си шарп) 10 17.04.2012 16:58
Какие то пробелы serres PHP 2 03.05.2011 13:44
Пробелы Progs1024 Помощь студентам 1 25.10.2009 21:06