Cheburashka
18.07.2009 15:35
Меня затронула одна тема, с которой я ни как не могу справиться. Это деление чисел.
Меня интересует деление одного числа на другое если эти числа находятся в массивах (в каждом элементе одна цифра) или в строках. К примеру массив A{1,1,1,1,1,1}, массив B {1,1,1}. Или в тех же самых строках s1='111111', s2='111';
Расскажите алгоритм по которому можно данные числа разделить в самих массивах (строках).
(Перевод числа в переменную целочисленного типа (longint, integer) не предлагать, так как я хочу использовать длинную арифметику.)
я знаю ток как просходит деление(умножение) двоичных чисе в ЭВМ.. незнаю подойтет тибе или нет?
Посмотри у Окулова, там все хорошо написано:
http://inf.1september.ru/2000/1/art/okul1.htmПроцедуры, написанные по Окулову, лежат у нас в FAQ-е ("Длинная арифметика").
Cheburashka
18.07.2009 18:23
Просто понимаете Окулов пишет такие, что начинающему программисту не понять (если я даже не знаю как пишутся процедуры и функции). Можете просто обычным простеньким алгоритмом объяснить мне как это работает?
Цитата
если я даже не знаю как пишутся процедуры и функции
, то ты эту задачу не решишь (или решишь - но ОЧЕНЬ неэффективно.)
Cheburashka
18.07.2009 19:01
Ну может быть это и так, но можете объяснить как это можно сделать?
Многострадальный раздел "Теория языка Паскаль" снова подвергается нападению.. Сергей, тебя что, интересует, как именно деление реализовано в TP? Если это вопрос про общий алгоритм - то и задавай его в разделе Алгоритмы!
М |
|
Тема переносится в раздел Алгоритмы. Сергей, персональное задание тебе: просмотри все разделы Форума, а также делай это перед каждым созданием новой темы!! Иначе - премод..
|
Если ты хочешь делить непосредственно в той системе счисления, в которой записаны числа (типа в десятичной), то в самом первом приближении деление реализуется по алгоритму, который ты знаешь с начальной школы: деление "уголком". Для этого (если ты еще помнишь, что проходил в первом классе)) нужно уметь умножать и вычитать, а для умножения (столбиком) нужно сложение. Так что сначала тебе придется реализовать сложение, вычитание и умножение. Дальше действуй непосредственно по агоритму "уголка": бери первые разряды от делимого, делитель умножай последовательно на числа, начиная с 1 и до основания системы (в десятичном случае от 1 до 10) пока результат не превысит взятый кусок делимого. Тогда к результату приписываешь цифру, на единицу меньшую множителя. Вычитаешь из этого куска произведение цифры на делитель, потом "сносишь цифру" (приписываешь справа) из делимого и повторяешь процесс, пока цифр для сноса не останется...
Это сильно неформальное описание, нуждающееся в доработке и оптимизации, но общий принцип такой. Кстати, тут есть некоторое пересечение с параллельной темой (про перестановки). Дело в том, что деление - это обратная операция к умножению. То есть, разделить a на b - это значит найти корень уравнения b*x=a. И если в операции умножения все определено (возьми a кучек по b предметов и пересчитай), то в делении приходится подбирать ответ (в уголке - брать по 4, по 5...) И это отражается на алгоритме (перебор всех цифр). Это чисто философское замечание, не особо заморачивайся, просто подумай)).
Cheburashka
20.07.2009 16:13
Извините, но я что-то запутался)
Не могли бы вы написать примерчик какой-нибдь?
Цитата(Сергей Меркурьев @ 20.07.2009 13:13)
Не могли бы вы написать примерчик какой-нибдь?
ммммм.... Ну, попробую..
539123948201 : 1756
result=0
Берем первую цифру делимого:
5 < 1756
сносим цифру:
5
3 < 1756
сносим цифру:
53
9 < 1756
сносим цифру:
539
1 > 1756
(!)try 1
1*1756=1756 <= 5391
try 2
2*1756=3512 <= 5391
try 3
3*1756=
5268 <= 5391
try 4
4*1756=7024 >= 5391 (!)
result = result*10+3 = 3
вычитаем:
5391-
5268=123
сносим цифру:
123
2 < 1756
result = result*10 = 30
сносим цифру:
1232
3 > 1756
(!) try 1
1*1756=1756 <= 12323
try 2
2*1756=3512 <= 12323
try 3
3*1756=5268 <= 12323
try 4
4*1756=7024 <= 12323
try 5
5*1756=8780 <= 12323
try 6
6*1756=10536 <= 12323
try 7
7*1756=
12292 <= 12323
try 8
8*1756=14048 > 12323
(!)result = result*10+7 = 30*10+7 = 307
вычитаем:
12323-
12292=31
сносим цифру
31
9 < 1756
сносим........ и т.д.
Я заранее извиняюсь, если нарутал со знаками неравенств.
Cheburashka
21.07.2009 14:21
Спасибо) Теперь какое-то представление имею!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.