|
Как определить, что число делится на 10? | ☑ | ||
---|---|---|---|---|
0
sda553
18.01.14
✎
15:44
|
Дано число. В двоичной записи 8*1024 бита.Есть ли какой то алгоритм, позволяющий быстро определить, что число делится на 10?
|
|||
1
Пеппи
18.01.14
✎
15:49
|
Любое число делится на 10 :)
|
|||
2
К_Дач
18.01.14
✎
15:49
|
http://ru.wikipedia.org/wiki/Признаки_делимости
|
|||
3
minsk1s
18.01.14
✎
15:55
|
(0) если ты имеешь ввиду результат=целое число. в одинэске прокатывает такая формул
Если (ТвоёЧисло/10)=Окр(ТвоёЧисло/10) Тогда //делится на 10 Конецесли: |
|||
4
wertyu
18.01.14
✎
15:55
|
(0) 10 - это 10 или 2?
|
|||
5
gr13
18.01.14
✎
15:58
|
(3) не смешно, если последнее число "0" в числе "1230", то на "0" делится. Не кажется ли тебе, что достать последний 0 из числа проще и быстрее чем делить на 0?
|
|||
6
gr13
18.01.14
✎
15:58
|
(+5) ...делить на 10
|
|||
7
КонецЦикла
18.01.14
✎
16:02
|
Если Число % 10 = 0
|
|||
8
wertyu
18.01.14
✎
16:03
|
я что ли один понял, что число дано в двоичном виде?
|
|||
9
wertyu
18.01.14
✎
16:06
|
в общем если надо делить на 2 (десятичное), то если последний знак будет 0, если 10 (десятичное), то наверно разбить на две подзадачи, проверить деление на 2 (десятичное) и на 5 (не знаю, если правило)
|
|||
10
gr13
18.01.14
✎
16:11
|
(8) а что такое 0 в двоичном коде?
|
|||
11
wertyu
18.01.14
✎
16:12
|
(10) 0 это 0, а что с ним не так?
|
|||
12
gr13
18.01.14
✎
16:14
|
||||
13
Юлия Цветочек
18.01.14
✎
16:34
|
Признак Паскаля — универсальный признак делимости, позволяющий для любых целых a и b определить, делится ли a на b. Точнее, он позволяет вывести почти все из выше приведённых признаков.
ПРИМЕР Пусть дано число и найдем сумму всех тетрад:: 00101011110001111100011000101000 => 2 + 11 + 12 + 7 + 12 + 6 + 2 + 8 = 60 Если полученная сумма кратна 10 - число делится на 10. Можно это проверить на любом числе, меньше 10000. |
|||
14
KRV
18.01.14
✎
16:37
|
Ха.. да если я захочу, то я и на ноль делить буду сколько не лень будет!
|
|||
15
Базис
naïve
18.01.14
✎
16:37
|
Половину чисел можешь делимостью на 2 отмести, остальные я бы честно делил.
(13) Доцент ты, а не цветочек. |
|||
16
spectre1978
18.01.14
✎
16:52
|
(0) проверить, равен ли остаток от деления 0
Если МоеЧисло % 10 = 0 Тогда // делится на 10 Иначе // не делится на 10 КонецЕсли |
|||
17
sda553
18.01.14
✎
17:02
|
(13)
10010001 тетрады 9 и 1 в сумме 10 однако исходное число, очевидно, на 10 не делится чяднт? |
|||
18
sda553
18.01.14
✎
17:04
|
(15) ты просто свел задачу к тому, как проверить, что число делится на пять
|
|||
19
wertyu
18.01.14
✎
17:09
|
(17) походу последние 4 надо умножать так
берём из 00101011110001111100011000101000 1000 и умножаем 1*0+0*8+0*4+0*2=0 - делится |
|||
20
sda553
18.01.14
✎
17:14
|
(19) не понял
|
|||
21
andrewalexk
18.01.14
✎
17:15
|
:) мда...дожили..
|
|||
22
Живой Ископаемый
18.01.14
✎
17:20
|
(1) 0 не делится на 10, что ты с ним ни делай
|
|||
23
andrewalexk
18.01.14
✎
17:24
|
(22) :) попался гуманитарий!
зы любое число делится на любое число...просто иногда получаются неопределенности |
|||
24
Пеппи
18.01.14
✎
17:27
|
Только на ноль поделить нельзя, но KRV говорит что может)
|
|||
25
andrewalexk
18.01.14
✎
17:30
|
:) еще один...у них тут косяк!
|
|||
26
Пеппи
18.01.14
✎
17:32
|
(25) ну может он особенный :)
|
|||
27
Живой Ископаемый
18.01.14
✎
17:33
|
Блин, точно... Совсем уже....
|
|||
28
wertyu
18.01.14
✎
17:40
|
(20) да, чего я прогнал, нашел признак для 16
|
|||
29
wertyu
18.01.14
✎
17:47
|
нулевой коэфф всегда 1
второй 1*2 mod 10 == 2 третий 2*2 mod 10 == 4 четвёртый 4*2 mod 10 == 8 пятый 8*2 mod 10 == 6 шестой 6*2 mod 10 == 2 <- цикл 00101011110001111100011000101000 84268426842684268426842684268421 00208026840004268400042000208000 <- тут поциферное произведение первой строки на вторую = 70 (это сумма всех цифр) |
|||
30
wertyu
18.01.14
✎
17:48
|
для твоего из (17)
10010001 84268421 80060001 = 15 |
|||
31
sda553
18.01.14
✎
18:12
|
Я уже нашел способ, почти как в 13 только правильнее так:
00101101111011111010 Первый бит справа очевидно должен быьть 0 иначе конец алгоритма и число не делится на 10. Складываем сумму тетрад без первого бита 0001+0110+1111+0111+1101=1+6+15+7+13=42 (достаточно последней цифры 2) и если эта сумма делится на пять, то все число делится на 10 |
|||
32
wertyu
18.01.14
✎
18:19
|
(31) нет, неправильно, надо складывать триады и проверять деление на 5, плюс доп условие, последний бит = 0
из это следует из правила для пяти там коэффциенты 1,2,4 в цикле, что фактически сумма триад |
|||
33
wertyu
18.01.14
✎
18:24
|
00101101111011111010
00+101+101+111+011+111+010=0+5+5+7+3+7+2=29 на пять не делится и остаток 4, хотя последний бит ноль |
|||
34
wertyu
18.01.14
✎
18:26
|
(31) тебе даже 42 mod 5 == 2 показывает, что это неправильно, т.к. реальный остаток равен 4
|
|||
35
КонецЦикла
18.01.14
✎
18:29
|
Переводить в десятичную еще не предлагали?
|
|||
36
wertyu
18.01.14
✎
18:30
|
(35) строку из 1024 байт?
|
|||
37
KRV
18.01.14
✎
18:46
|
(24),(25) мой ноль! Хочу - делю, не хочу - не делю.. и вообще - мой ноль он, зараза, хитрый.. чему он чичаз равен я не знаю - как скажет, так и будет!
|
|||
38
sda553
18.01.14
✎
19:20
|
(34) 42=(двоично)=101010
разбиваем на тетрады без правого бита 101010=000101010=0001_0101_0 первая тетрада 1 вторая тетрада 5 5+1=6 т.е. на пять не делится, значит все число не делится на 10 |
|||
39
andrewalexk
18.01.14
✎
19:23
|
(37) ?) покажи документы на ноль
|
|||
40
User_Agronom
18.01.14
✎
19:24
|
(8) Вы путаете число и форму записи числа. Даже если Вы напишите римскими цифрами суть числа не измениться.
|
|||
41
sda553
18.01.14
✎
19:34
|
(34) остаток от деления на 10 то же легко найти.
сумма тетрад без правого бита делим на 5 получаем остаток. Остаток умножаем на 2 и прибавляем правый бит. Для (38) это будет (6 mod 5)*2+0=2 |
|||
42
wertyu
18.01.14
✎
19:45
|
(40) я ничего не путаю, число записано в двоичном виде, надо по этому представлению определить делится оно на 10 или нет
|
|||
43
wertyu
18.01.14
✎
19:51
|
(38) ты походу опять не понял, в (13) есть указание, что можно использовать Признак Паскаля
посмотреть в можешь вики, там пример для десятичной системы, чтобы использовать для двоичной, надо во все формулы определения остатков вместо 10 подставить 2 я расписал тебе признак делимости для 10 и для 5, т.е. опеределил коэффициенты 10: нулевой коэфф всегда 1 второй 1*2 mod 10 == 2 третий 2*2 mod 10 == 4 четвёртый 4*2 mod 10 == 8 пятый 8*2 mod 10 == 6 шестой 6*2 mod 10 == 2 <- цикл 5: 0й - 1 1й - 2 2й - 4 3й - 1 <- цикл т.е. фактически для пяти получается, что признаком будет сложение триад |
|||
44
sda553
18.01.14
✎
19:59
|
Все правильно, только не триад, а тетрад.
Пример число 26 В двоичной записи это 011010 В триадах это 011_010 т.е. 3 и 2. В сумме будет пять. Однако 26 на пять не делится ------- А теперь правильно разбиваем на тетрады 00011010 в триадах это 0001_1010 т.е. 1 и 10, в сумме 11 Остаток от деления на пять 1, правильно -------- Таким образом тепер получается следующий алгоритм. Двоичное число делится на 10 если сумма его тетрад делится на 5 и последний бит 0. |
|||
45
wertyu
18.01.14
✎
20:01
|
(44) не упорствуй, коэффициентов всего три 1,2,4, ну нет там коэффициента 8 для тетрады, хотя бы потому как 8 больше 5
|
|||
46
sda553
18.01.14
✎
20:02
|
(45) Объясни как определить твоим способом остаток от деления на пять числа 26 (011010)?
|
|||
47
wertyu
18.01.14
✎
20:14
|
(46) да ты почти прав, я с коэффициентами ошибся, вернее с их количеством, но не это делает твой способ верным
5: 0й - 1 1й - 2 2й - 4 3й - 3 4й - 1 <- цикл 011010 268421=6+8+2=16 16 mod 5 == 1 00101011110001111100011000101000 34213421342134213421342134213421 00203021340004213400042000203000=5+6+11+11+7=40 если посмотреть на коэффициенты, то видно 3, 4, 2, 1 и если к 3 прибавить 5, которое на результат деления не повлияет, то получим 8, 4, 2, 1 |
|||
48
sda553
18.01.14
✎
20:17
|
(47) да я пока и не говорил, что именно делает мой способ верным. Посидел посчитал и пришел к такому способу. Ты посчитал по своему, вначале ошибся и я тебя поправил
|
|||
49
wertyu
18.01.14
✎
20:26
|
(48) это не мой, это Паскаля ) там доказательство довольно простое, поэтому если не сходится, значит ошибся с коэффициентами
|
|||
50
Salimbek
18.01.14
✎
20:31
|
(0) двоичное число преобразуется в десятичное как
1*б1+2*б2+4*б3+8*б4+16*б5+32*б6+64*б7+... Если рассмотреть остаток от деления этого на 10, то получим: 1*б1+2*б2+4+б3+8*б4+6*б5+2*б6+4*б7+... (повторяются циклически коэффициенты 2, 4, 8, 6) Ну и если получается большое число в сумме, то повторить алгоритм еще раз |
|||
51
wertyu
18.01.14
✎
20:33
|
(50) см (29)
|
|||
52
Salimbek
18.01.14
✎
20:34
|
(51) а... ну да
|
|||
53
wertyu
18.01.14
✎
20:36
|
(52) ТС выбрал комби, признак на 5 (сложение тетрад со предпоследнего и бита и чётность последнего бита)
|
|||
54
Salimbek
18.01.14
✎
20:41
|
+(52) Только число 70 тоже разложить 70=
1000110 4268421 ------- 4000420 = дает в сумме 10, т.е. делится на 70 ;-) (53) Это, кстати, частный случай, т.е. коэффициенты становятся только в 2 раза меньше, в частности для 70=1000110 - отбрасываем последний бит=> 100011 и для него строим в цикле коэффициенты 100011 213421 ------ 200021 - сумма дает 5, т.е. 70 делится на 5 и за счет проверки последнего бита на равенство 0 = получаем что все число делится на 10 |
|||
55
Принт
18.01.14
✎
20:43
|
пока самый быстрый вариант поделить на 10
|
|||
56
wertyu
18.01.14
✎
20:47
|
(55) строку из 0 и 1?
|
|||
57
Salimbek
18.01.14
✎
20:49
|
(55) смогешь быстро поделить двоичное: 101010101010101010101010101010101010101010101010101101011010101010101010101001010101001011101010110001111101101101000111001001001011101010111001100110
|
|||
58
wertyu
18.01.14
✎
20:50
|
(54).2 если там строка, я думаю проще всё-таки складывать справа на лево коэффициенты 5 или 10, а от комби взять проверку последнего бита, для сокращения работы алгоритма при очевидном итоговом результате
|
|||
59
Salimbek
18.01.14
✎
20:50
|
в (57) при этом всего 150 знаков, в условии (0) в 54 раза больше
|
|||
60
wertyu
18.01.14
✎
20:52
|
+(58) ну тупо
Если СимволСтроки = "1" Тогда Сумма = Сумма + КоэффициентПоПорядку; КонецЕсли; |
|||
61
wertyu
18.01.14
✎
20:54
|
+(60) а сам коэффициент определять из счетчика цикла
|
|||
62
xReason
18.01.14
✎
20:55
|
Если нацело,то в конце 0 , тут горе программеры делят его зачем-то ))))))
|
|||
63
wertyu
18.01.14
✎
20:56
|
(62) ещё один провокатор )
|
|||
64
Salimbek
18.01.14
✎
20:56
|
(60) ну да, по очереди берешь коэффициент и прибавляешь, итоговая сумма не превысит 81920, что позволяет проверить и тупо делением.
(62) Двоичное число, для примера, я привел в (57). Проверь... |
|||
65
xReason
18.01.14
✎
20:56
|
могу рассказать, как узнать делятся или на 5,2,3 и 9
вот горе от ума - перемудрили |
|||
66
wertyu
18.01.14
✎
20:57
|
(65) валяй
|
|||
67
Salimbek
18.01.14
✎
20:58
|
слишком длинно получилось, поделю в несколько строк:
Итак, (65) предлагаю сказать, делится ли на 10 число (в двоичной записи) 10101010101010101010101010101010101010101010101010110101101010 10101010101010010101010010111010101100011111011011010001110010 01001011101010111001100110 |
|||
68
xReason
18.01.14
✎
20:58
|
(66) система десятичная?
|
|||
69
sda553
18.01.14
✎
20:59
|
(53) я уже упростил, для деления на пять можно разбивать на триады даже с последним битом.
|
|||
70
wertyu
18.01.14
✎
20:59
|
(68) двоичная
|
|||
71
xReason
18.01.14
✎
20:59
|
(70) я сегодня только с поллитровой работаю
|
|||
72
wertyu
18.01.14
✎
20:59
|
(69) тетрады )
|
|||
73
sda553
18.01.14
✎
21:00
|
(72) да, оговорка. Конечно на тетрады
|
|||
74
Принт
18.01.14
✎
21:00
|
(56) про строки ничего сказано не было
|
|||
75
wertyu
18.01.14
✎
21:01
|
(74) "Дано число. В двоичной записи 8*1024 бита"
|
|||
76
wertyu
18.01.14
✎
21:02
|
(73) ну в общем то да, смещения вправо (деления на 2) не требуется
|
|||
77
wertyu
18.01.14
✎
21:08
|
СтрокаБитов = "01100101"; // хз как ты её там получаешь
ДлинаБитов = СтрДлина(СтрокаБитов); Сумма = 0; Для НС = 0 По ДлинаБибов - 1 Цикл СимволСтроки = Сред(СтрокаБитов, ДлинаБитов - НС, 1); Если СимволСтроки = "1" Тогда КоэффициентПоПорядку = Pow(2, НС % 4); Сумма = Сумма + КоэффициентПоПорядку; КонецЕсли; КонецЦикла; |
|||
78
wertyu
18.01.14
✎
21:09
|
КоэффициентПоПорядку = Pow(2, НС % 4);
Сумма = Сумма + КоэффициентПоПорядку; в одну строку Сумма = Сумма + Pow(2, НС % 4); |
|||
79
sda553
18.01.14
✎
21:14
|
(77) На самом деле все в моем частном случае проще у меня это число записано в шестнадцатеричной строке вида
0xffe3a578 Так что достаточно просто вычислять f+f+e+3+a+5+7+8 |
|||
80
sda553
18.01.14
✎
21:30
|
Кстати, суммой тетрад можно проверять делимость двоичного числа вообще на любое простое число (кроме 2 которое проверяется элементарно)
|
|||
81
Принт
18.01.14
✎
21:32
|
(80) почему именно тетрад?
|
|||
82
wertyu
18.01.14
✎
21:32
|
(80) например возьмём 7
|
|||
83
sda553
18.01.14
✎
21:32
|
(80) а нет, гон.
|
|||
84
wertyu
18.01.14
✎
21:34
|
(83) вот для 7 сумма триад
|
|||
85
sda553
18.01.14
✎
21:36
|
Надо чтобы в системе счисления основанной на этом простом числе возникала цикличность последнего знака, тогда и можно складывать куски размером с эту цикличность
для 7 - да, это триады 1-1 10-2 100-4 1000-1 10000-2 |
|||
86
wertyu
18.01.14
✎
21:37
|
(85) а для 11 вообще 10 коэффициентов
|
|||
87
wertyu
18.01.14
✎
21:37
|
+(86) ну т.е. максимально возможное
|
|||
88
sda553
18.01.14
✎
21:38
|
а цикличность возникает всегда, хотя бы потому, что число возможных цифр в последнем знаке конечна
|
|||
89
sda553
18.01.14
✎
21:39
|
таким образом двоичная система самая удобная для проверки на делимость
|
|||
90
wertyu
18.01.14
✎
21:41
|
(88) конечно всегда, она ограничена Число - 1
|
|||
91
wertyu
18.01.14
✎
21:42
|
+(90)* Делитель - 1
|
|||
92
User_Agronom
18.01.14
✎
21:46
|
(42) Это же элементарно. Тип string. Состоит только из цифр. Последняя цифра ноль.
Проверку на цифры, проверку последнего символа. |
|||
93
wertyu
18.01.14
✎
21:52
|
(92) ты о чём?
|
|||
94
User_Agronom
18.01.14
✎
21:58
|
(92) pardon. Не внимательно подумал.
(85) 2 в степени n никогда не будет иметь последней цифрой 0. Поэтому этот метод негоден. |
|||
95
mikeA
18.01.14
✎
22:00
|
( ((n) & 1) == 0 && ((n) * 0xcccccccd) <= 0x33333333 )
|
|||
96
mikeA
18.01.14
✎
22:01
|
(95)+ для 32 бит
|
|||
97
sda553
18.01.14
✎
22:01
|
(95) что это за условие, выполнимо только при n=0
Такая извращенная проверка на 0? |
|||
98
User_Agronom
18.01.14
✎
22:02
|
Чтобы число делилось на 10 без остатка необходимо и достаточно чтобы оно делилось без остатка на 2 и делилось без остатка на 5.
Проверить деление на 2 легко. Вся проблема в том, чтобы проверить деление на 5. Трудность состоит в том, что 2^n никогда не будет равна 5^m |
|||
99
sda553
18.01.14
✎
22:03
|
(98) Пока ты думал, мы уже на любое простое число делимость проверять научились
|
|||
100
Neg
18.01.14
✎
22:04
|
100 делится
|
|||
101
wertyu
18.01.14
✎
22:04
|
(99) это не мы, а Паскаль, Гаусс и Эйлер ) Гаусс вообще первообразные корни забабахал )
|
|||
102
sda553
18.01.14
✎
22:08
|
(101) лично я, независимо от них это сделао сегодня
|
|||
103
mikeA
18.01.14
✎
22:09
|
(97) & это побитовое И, && - логическое
первая проверка делимости на 2, вторая - на 5 |
|||
104
User_Agronom
18.01.14
✎
22:10
|
(99) Где? Покажи как проверить делимость на 5. Я не нашел в ветке.
|
|||
105
wertyu
18.01.14
✎
22:12
|
(104) в (77) уже в коде одноэса
|
|||
106
User_Agronom
18.01.14
✎
22:16
|
(105) Там же простое преобразование в число. Это слишком просто и неинтересно ))
|
|||
107
sda553
18.01.14
✎
22:16
|
(104) Разбивать строку на куски по 4 бита и эти цифры сложить, если делится на 5 то все число делится на пять.
Пример 1000110110000100 разбиваем на 1000+1101+1000+0100 считаем 8+13+8+4=33 на 5 не делится, значит все число на 5 не делится |
|||
108
User_Agronom
18.01.14
✎
22:17
|
(103) Мне интересно, как Вы собрались реализовывать побитовое сравнение с символами строки.
|
|||
109
wertyu
18.01.14
✎
22:17
|
(106) нет
|
|||
110
sda553
18.01.14
✎
22:18
|
(108) мапингом (по 1совски-соответствием)
|
|||
111
sda553
18.01.14
✎
22:20
|
(106) там не преобразование в число
|
|||
112
User_Agronom
18.01.14
✎
22:22
|
(107) Это оптимизация (77) Блоки по четыре позволяют преобразовывать в шестнадцатиричную систему, блоки по три в восьмиричную и т.д.
Вижу отличие. И что, это работает? |
|||
113
wertyu
18.01.14
✎
22:23
|
(106) исходный признак делимости на 5 в (13) он там неверно назван признаком делимости на 10
|
|||
114
sda553
18.01.14
✎
22:23
|
(112) ага
|
|||
115
sda553
18.01.14
✎
22:24
|
причем для любого простого числа, только куски разной длины. Например для проверки на 7 надо разбивать на куски по три бита
|
|||
116
wertyu
18.01.14
✎
22:26
|
(115) да нет, не так
смотри например для 11 надо не только на блоки по 10 бит разбивать, но и ещё и коэффициенты будут в таком порядке: 6 3 7 9 10 5 8 4 2 1 |
|||
117
wertyu
18.01.14
✎
22:28
|
т.е. это остатки от деления степеней 2 на 11
2^9,...,2^0 |
|||
118
wertyu
18.01.14
✎
22:29
|
но фактически можно просто эти остатки в цикле складывать
|
|||
119
wertyu
18.01.14
✎
22:35
|
+(118) конечно, если коэффициент на знакоместе единицы
|
|||
120
sda553
18.01.14
✎
22:40
|
(119) не надо там никаких остатков. Число простое и коэффициенты не кратны, умножение на них на делимость не влияет
|
|||
121
wertyu
18.01.14
✎
22:43
|
(120) коэффициенты это и есть остатки, а случай 5 просто исключительный, когда коэффициенты (остатки) это степени двойки, кроме 3, но его опять же по равенству остатка можно заменить на 8
|
|||
122
wertyu
18.01.14
✎
22:48
|
+(121) а с 11 будет именно 10 коэффициентов, потому как 2 является первообразным корнем 11
|
|||
123
wertyu
18.01.14
✎
23:30
|
(120) прикольно в (95) пофиг на всю последовательность, можно просто последний бит проверять, потом брать младшие 4 байта умножать на cccccccdh, брать от произведения младший байт и сравнивать его с 33333333h
|
|||
124
ЧеловекДуши
19.01.14
✎
10:07
|
(8) А в ПК все в двоичной форме. :)
|
|||
125
ЧеловекДуши
19.01.14
✎
10:08
|
Кто что пишет... Вы хоть у автора спросили, на каком языке программирования нужно это выразить :)
|
|||
126
Salimbek
19.01.14
✎
10:52
|
(107) Задумался, почему твой вариант работает... оказалось все просто, коэффициенты, которые мы рассчитали для битов, при проверке делимости на 5 (1,2,4,3):
10111001 34213421 ------ 30213001=10 80218001=20 В твоем же раскладе получается, что используются коэффициенты: 1,2,4,8=(3+5). Таким образом при добавлении 5 делимость на 5 не нарушается. И только по этому срабатывает. (125) Придуманный алгоритм можно выразить на любом языке. |
|||
127
wertyu
19.01.14
✎
11:41
|
(126) надо было (47) прочитать )
|
|||
128
sda553
19.01.14
✎
12:55
|
(125) Да хоть на брейнфаке, мне это без разницы. Главное алгоритм
|
|||
129
Как страшно жить
19.01.14
✎
13:04
|
(128) алгоритм описан тут
wiki:Признак_Паскаля |
|||
130
sda553
19.01.14
✎
13:59
|
(122)
Берем деление на 11 и разберем по признаку Паскаля r1=2 mod 11 =2 r2= 4 mod 11 =4 r3= 8 mod 11 = 8 r4 = 16 mod 11 =5 r5 = 10 mod 11 = 10 r6 = 20 mod 11 = 9 r7= 18 mod 11 = 7 r8= 14 mod 11 = 3 r9= 6 mod 11 = 6 r10 = 12 mod 11 = 1 = r0 Следовательно для двоичного числа А вида. ...а10 а9 а8 а7 а6 а5 а4 а3 а2 а1 а0 мы получаем что его делимость, это делимость на 11 числа а0+a1*2+а2*4+...+a7*7+a8*3+a9*6+{a10+a11*2...} но обратим внимание, что а7*7 mod 11 = а7*(7+11*11) mod 11=а7*128 mod 11 и аналогично а8*3 mod 11 = a8*(3+11*23) mod 11 = a8*256 mod 11 А это значит, что можно проверять на делимость на 11 такое выражение a0+a1*2+a2*4+...+a7*128+a8*256+a9*512+{a10+a11*2...} Отсюда видно, что мы можем просто брать куски по 10 битов, складывать их Без всяких коэффициентов. И не усложнять программу. |
|||
131
zva
19.01.14
✎
14:12
|
||||
132
sda553
19.01.14
✎
14:23
|
(131) фигня
Делимость на 5 это суммы блоков по 4 бита делятся на 5 Делимость на 7 это суммы блоков по 3 бита делятся на 7 Делимость на 9 это суммы блоков по 6 бит делятся на 9 |
|||
133
wertyu
21.01.14
✎
12:35
|
(130) а, так уже просто посчитал, тогда согласен без вопросов
|
|||
134
Рэйв
21.01.14
✎
12:38
|
Если МоеЧисло%10=0 Тогда
Сообщить("Да"); Иначе Сообщить("Нет"); КонецЕсли; //----------------- Уже предлагали: |
|||
135
Рэйв
21.01.14
✎
12:38
|
?
|
|||
136
sda553
21.01.14
✎
12:41
|
(135) ага, выдает неправильный результат в случае если
МоеЧисло = "1000001101001011011110101101010" |
|||
137
wertyu
21.01.14
✎
12:42
|
(130) теперь я понял, про что ты говорил, признаки делимости на число m (простое) в двоичной системе - это просто сложение n-битных конструкций, где 0<m<n-1
|
|||
138
Рэйв
21.01.14
✎
12:42
|
(136)Так разговор про двоичные числа?
|
|||
139
wertyu
21.01.14
✎
12:42
|
(138) да
|
|||
140
wertyu
21.01.14
✎
12:43
|
+(137) тьфу, где 0<n<m-1
|
|||
141
wertyu
21.01.14
✎
12:44
|
да блин 0<n<m
|
|||
142
Рэйв
21.01.14
✎
12:45
|
Если Прав(Строка(ДвоичноеЧисло),4)="1010" Тогда
Сообщить("Делится"); Иначе Сообщить("Не делится"); КонецЕсли; Так пойдет?:-) |
|||
143
sda553
21.01.14
✎
12:45
|
(137) ну наконец то.
Потому я и заметил, что двоичная система очень удобна в плане проверки на делимость. Т.к. для каждого простого числа найдется блок какой то длины, на который можно разбить и поскладывать. Для непростых то же самое, кстати, только блоки не с младшего бита могут начинаться и к ним придется по определенному закону еще хвост приделать |
|||
144
wertyu
21.01.14
✎
12:46
|
потому как остаток любого разряда k можно будет дополнить до 2^k, т.к. это остаток от 2^k mod m
|
|||
145
sda553
21.01.14
✎
12:46
|
(142) Ну конечно же нет, выдает неправильный результат при 11010 (число 26)
|
|||
146
wertyu
21.01.14
✎
12:47
|
(143) кроме m вида 2^n
|
|||
147
Рэйв
21.01.14
✎
12:47
|
(146)А оно не делится чтобы без остатка
|
|||
148
Рэйв
21.01.14
✎
12:48
|
ааа...понял
|
|||
149
wertyu
21.01.14
✎
12:49
|
(148) признак делимости на число m в двоичной системе - это просто сложение n-битных конструкций, где 0<n<m, кроме m вида 2^k
|
|||
150
wertyu
21.01.14
✎
12:50
|
все числа конечно натуральные и больше 1
|
|||
151
sda553
21.01.14
✎
12:53
|
(149) Не всегда, иногда зацикливание в признаке может произойти с какого то момента на ноль. и Дальше всегда тогда будет ноль. Тогда достаточно проверить хвост в котором еще был не ноль. Это охватывает числа 2^k
|
|||
152
wertyu
21.01.14
✎
12:55
|
(151) но можно точно сказать, что конструкция будет m-1 - битная для m, у которых 2 первообразный корень
|
|||
153
wertyu
21.01.14
✎
12:59
|
вообще этот признак будет справедлив для любой системы счисления, просто для достаточно малых чисел не будет иметь смысла
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |