(no subject)
Friday, 30 March 2012 14:51![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
> задача о разработке метода определения делимости числа на 15, при условии, что запись числа настолько длинная, что не влезает ни в один целочисленный тип (т.е., грубо говоря, делить напрямую нельзя).
http://smartsourcing.ru/blogs/kurilka/1364
Очевидно, что необходимо и достаточно выполнение двух условий:
а) последняя цифра 5 или 0
б) сумма цифр (aka X mod 9) делится на три. Свойста этой штуки таковы, что на самом деле полную сумму считать не нужно: достаточно складывать цифры по одной, и как только результат становится двузначным - останавливаться, делить на 9 с остатком, продолжать.
(вообще, порог 20 здесь произвольный. Можно и 100 взять - чтоб не слишком часто делить)
http://smartsourcing.ru/blogs/kurilka/1364
Очевидно, что необходимо и достаточно выполнение двух условий:
а) последняя цифра 5 или 0
б) сумма цифр (aka X mod 9) делится на три. Свойста этой штуки таковы, что на самом деле полную сумму считать не нужно: достаточно складывать цифры по одной, и как только результат становится двузначным - останавливаться, делить на 9 с остатком, продолжать.
def mod9(n): sum = 0 for x in n: sum+=int(x) if sum>20: sum = sum % 9 return sum # x задано как строка if x[-1] in ('0', '5') and mod9(list(x)) % 3 == 0: print "yes' else: print "no"
(вообще, порог 20 здесь произвольный. Можно и 100 взять - чтоб не слишком часто делить)
no subject
2012-03-30 19:16 (UTC)no subject
2012-03-31 13:47 (UTC)no subject
2012-03-31 13:53 (UTC)no subject
2012-04-01 17:32 (UTC)И тем более (в частном случае), быстрее даже однократного деления (а нам и нужен только остаток). И тем более для bignum.
no subject
2012-04-01 19:02 (UTC)no subject
2012-04-01 19:35 (UTC)На питоне может проверим?:)
Я тоже рассказывал, про ЗИЭИТ и дельфи/ассемблер :)
> Подозреваю, в библиотеках реализован какой-то более эффективный алгоритм перевода систем счисления, сравнительно с тупым делением.
Для частных случаев, возможно. Но я тут немного погуглил - говорят что до O(l log l) в лучшем случае, по сравнению с схемой Горнера O(l^2). Но нам нужен только собственно остаток от деления на первую степень, а его можно получить делением тупо в столбик (если у нас уже есть десятичная строка) - O(l), как и в моём варианте для частного случая, с точностью до коэффициента.
no subject
2012-04-01 19:41 (UTC)