Re: Непрактичне
Перевірка подільності (продовження).
Трохи коду (APL):
fadd←{10>⍵-res←⍺×⌊⍵÷⍺:res⋄⍬}¨
fsub←{10>-⍵-res←⍺×⌈⍵÷⍺:res⋄⍬}¨
fall←(∊(fadd,fsub))
{⎕←⍵ ':' (⍵fall,100 1000∘.×1+⍳10)⋄⍬}¨23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
А ось так виглядає результат роботи:
⍝ 23 : 92 299 391 598 897 4991 6992 8993 207 506 805 2001 4002 6003 8004 10005
⍝ 29 : 493 696 899 203 406 609 2001 4002 6003 8004 10005
⍝ 31 : 93 496 899 992 992 3999 4991 7998 403 806 3007 7006
⍝ 37 : 296 592 999 999 1998 2997 3996 4995 5994 6993 7992 8991 407 703
⍝ 41 : 492 697 2993 7995 205 902 2009 5002 10004
⍝ 43 : 3999 7998 301 602 903 7009
⍝ 47 : 94 799 893 3995 705 3008 7003
⍝ 53 : 795 6996 106 901 1007 1007 8003
⍝ 59 : 295 708 1003 1003 2006 3009
⍝ 61 : 793 7991 305 5002 10004
⍝ 67 : 201 402 603 804 1005 1005
⍝ 71 : 497 994 994
⍝ 73 : 292 2993 803 7008 10001
⍝ 79 : 395 3002 6004 9006
⍝ 83 : 498 996 996 1992
⍝ 89 : 801 4005
⍝ 97 : 97 194 291 9991 3007
Що це таке, і як його використовувати. Ліворуч від двокрапки — число, подільність на яке ми хочемо перевірити. Праворуч — допоміжні числа, будь-яке з яких можна взяти за основу правила перевірки подільності.
Якщо допоміжне число містить посередині дев'ятки, знаходимо найближче кругле число, більше за нього (напр., для 493 найближче кругле число — 500). 493+7=500, з чого можна зробити перетворення з додаванням:
while n>=500 do n:= (n div 500)*7 + (n mod 500);
Якщо допоміжне число містить посередині нулі, знаходимо найближче кругле число, менше за нього (напр., для 203 найближче кругле число — 200). 203-3=200, з чого можна зробити перетворення з відніманням:
while n>=200 do n:= abs((n div 200)*3 - (n mod 200));
Обидва перетворення в цих прикладах можна використати при перевірці подільності на 29: якщо число n після такого перетворення ділиться на 29, то початкове n теж ділиться на 29, і навпаки.
У цих прикладах робиться ділення не на степінь десяти, а на число з однією ненульовою цифрою — це дещо складніша операція, яку, проте, виконувати легше, ніж ділення безпосередньо на 29, котре містить вже дві ненульові цифри. Тоді як ділення на 200, 5000 чи 70 вимагає приблизно таких же зусиль, як і ділення на 2, 5 чи 7.
Приклад: перевірка подільності 123456 на 29, для чого ми використаємо «493+7=500»:
123456 => 123456 : 500 => [1234:5] 56 => [246, остача 4] 56 => 246 456 => 246*7 + 456 = 1722 + 456 = 2178
2178 => 2178 : 500 => [21:5] 78 => [4, остача 1] 78 => 4 178 => 4*7+178 = 28+178 = 206
Поділивши 206 на 29, ми побачимо, що воно не ділиться, а тому й 123456 на 29 не ділиться.