Имя: Пароль:
IT
 
Как определить, что число делится на 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
вообще этот признак будет справедлив для любой системы счисления, просто для достаточно малых чисел не будет иметь смысла