|
Как определить, что число делится на 10? | ☑ | ||
---|---|---|---|---|
0
sda553
18.01.14
✎
15:44
|
Дано число. В двоичной записи 8*1024 бита.Есть ли какой то алгоритм, позволяющий быстро определить, что число делится на 10?
|
|||
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
|
вообще этот признак будет справедлив для любой системы счисления, просто для достаточно малых чисел не будет иметь смысла
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |