|
Помогите с алгоритмом!, проверка элементов массива на кратность 2^k |
|
|
|
May 27 2009, 13:30
|
Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629

|
Помогите с алгоритмом, пожалуйста! Нужно организовать проверку элементов массива на кратность 2^k, где k=1...4 unsure.gif
Делаю на ассемблере
Сообщение отредактировал Gabe - May 27 2009, 13:31
|
|
|
|
|
 |
Ответов
|
May 29 2009, 12:51
|
Знающий
   
Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119

|
Цитата(Rst7 @ May 29 2009, 13:34)  Вот черт. Действительно... Хотя - это не вопрос. Умножаем вход на 3 и делим на 15  Все прально, только умножать не надо  А делить можно и на 255.. int Rest_5(int k) { k=(k&255)+(k>>8); k=(k&15)+(k>>4); k=(k&15)+(k>>4); if(k>=10)k=k-10; if(k>=5)k=k-5; return(k); } Это я писал для 13-битового числа. В общем виде можно поставить while в одном-двух местах  Правда, смысл первых строчек уже не помню... Вот! Вспомнил наконец! Общая идея, которой я руководствовался в детстве при написании этих программ, заключается в том, что из числа можно вычесть любое число, кратное делителю, и при этом остаток от деления не изменится.
|
|
|
|
|
May 29 2009, 14:06
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(SKov @ May 29 2009, 15:51)  Правда, смысл первых строчек уже не помню... Вот! Вспомнил наконец! Общая идея, которой я руководствовался в детстве при написании этих программ, заключается в том, что из числа можно вычесть любое число, кратное делителю, и при этом остаток от деления не изменится. Смысл первых строчек немного в другом... Для остатка от деления справедливо следующее (А + В) % С = (А % С + В % С) % С (А * В) % С = (А * (В % С)) % С Число k можно представить как k= A*256 + B. Легко увидеть, что А= k >> 8; B= k & 255; тогда искомый остаток от деления на 5 (назовём его R) R= k % 5 = (A*256 + В) % 5 = ((A*256) % 5 + В % 5) % 5 Остаток от деления 256 на 5 равен 1 (это важно, т.к. результат умножения числа на единицу - есть само число, то есть, можно избавиться от умножения), тогда (А*256) % 5 = (А * (256 % 5)) % 5 = (А * 1) % 5 = А % 5 Итак R= (A % 5 + В % 5) % 5 = (А + В) % 5, т.е. искомый остаток равен остатку от деления на 5 уже меньшего числа. Из этих преобразований появилась строка в функции k=(k&255)+(k>>8); Аналогично со строкой k=(k&15)+(k>>4); Все рассуждения - похожие, но число k представляется уже как k= А*16 + В
|
|
|
|
|
May 29 2009, 14:26
|
Знающий
   
Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119

|
Цитата(Палыч @ May 29 2009, 18:06)  Смысл первых строчек немного в другом...
Для остатка от деления справедливо следующее (А + В) % С = (А % С + В % С) % С (А * В) % С = (А * (В % С)) % С
Число k можно представить как k= A*256 + B. Легко увидеть, что А= k >> 8; B= k & 255; тогда искомый остаток от деления на 5 (назовём его R) R= k % 5 = (A*256 + В) % 5 = ((A*256) % 5 + В % 5) % 5 Остаток от деления 256 на 5 равен 1 (это важно, т.к. результат умножения числа на единицу - есть само число, то есть, можно избавиться от умножения), тогда (А*256) % 5 = (А * (256 % 5)) % 5 = (А * 1) % 5 = А % 5 Итак R= (A % 5 + В % 5) % 5 = (А + В) % 5, т.е. искомый остаток равен остатку от деления на 5 уже меньшего числа. Из этих преобразований появилась строка в функции k=(k&255)+(k>>8);
Аналогично со строкой k=(k&15)+(k>>4); Все рассуждения - похожие, но число k представляется уже как k= А*16 + В Ну вы тут и накрутили на ровном месте  Все намного проще: R= k % 5 = (A*255 + В) % 5 = B%5 В первой строчке делается первый шаг поиска остатка от деления на 255. В результате получаем некое B, которое значительно меньше исходного числа. И т.д. Идея в том, что можно сначала искать модуль для бОльшего делителя, а затем работать с маленьким остатком дальше. Главное условие в том, чтобы этот бОльший делитель был кратным маленькому делителю, для которого нас интересует конечный результат. Нам подходят числа 15 и 255 в качестве бОльших делителей потому что а) Для них легко искать остаток от деления б) Они делятся на 5 нацело. Ч.т.д.
|
|
|
|
|
May 29 2009, 15:37
|
Знающий
   
Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119

|
Цитата(Палыч @ May 29 2009, 19:00)  Согласен. Только помните, что спорим мы в разделе для начинающих, и не каждый дружен с математикой настолько, чтобы представить двоичное число в виде k= A*255+b, ведь 255 - это не степень двойки А причем здесь двоичное число и способ его представления? Все что мы писали в наших постах справедливо для десятичных чисел, вполне доступных для понимания даже начинающих. И в моих функциях используются исключительно десятичные числа. Или я не понял замечания?
|
|
|
|
Сообщений в этой теме
Gabe Помогите с алгоритмом! May 27 2009, 13:30 Сергей Борщ Цитата(Gabe @ May 27 2009, 16:30) Нужно о... May 27 2009, 13:43 Gabe Огромное спасибо!!!
Осталось только в ... May 27 2009, 13:47 Gabe ЦитатаDO 8, endfor
MOVE (A0)+, R2 /* загру... May 27 2009, 16:08 Rst7 Молодой человек, зачем Вы вообще в ассемблер сунул... May 27 2009, 16:27 Gabe мне необходимо её написать на ассемблере, так как ... May 27 2009, 16:32 Rst7 Цитатамне необходимо её написать на ассемблере, та... May 27 2009, 16:42 Gabe не ругайтесь, пожалуйста, я только начинающий, поэ... May 27 2009, 17:40 Gabe С элементами, кратными 2,4,8 понятно. Как найти чи... May 28 2009, 03:57 SKov Цитата(Gabe @ May 28 2009, 07:57) С элеме... May 28 2009, 10:22  Палыч Цитата(SKov @ May 28 2009, 13:22) А чего ... May 29 2009, 05:23   SKov Цитата(Палыч @ May 29 2009, 09:23) P.S. М... May 29 2009, 08:27    Палыч Цитата(SKov @ May 29 2009, 11:27) Да, обы... May 29 2009, 09:54 Rst7 Проще всего будет банально разделить и проверить о... May 28 2009, 04:01 Gabe Банально разделить можно только в RISC-ядре, там е... May 28 2009, 04:20 Палыч Цитата(Gabe @ May 28 2009, 07:20) Подсказ... May 28 2009, 05:09 Палыч Цитата(Gabe @ May 28 2009, 07:20) Подсказ... May 28 2009, 05:14 Rst7 Напишите деление в столбик самостоятельно. Тем бол... May 28 2009, 05:13 Gabe Rst7, новых итераций не будет
Палыч, спасибо, буде... May 28 2009, 09:48 Gabe кажется, для 7 будет:
while (k>7) k=(k&7)+(... May 28 2009, 16:31 SKov Цитата(Gabe @ May 28 2009, 20:31) кажется... May 28 2009, 16:55 Rst7 Вспомнил - http://graphics.stanford.edu/~seander/b... May 29 2009, 09:07 SKov Цитата(Rst7 @ May 29 2009, 13:07) Вспомни... May 29 2009, 09:29        Палыч Цитата(SKov @ May 29 2009, 18:37) А приче... May 29 2009, 15:59         SKov Цитата(Палыч @ May 29 2009, 19:59) Просто... May 29 2009, 16:49          singlskv Цитата(SKov @ May 29 2009, 20:49) Теперь ... May 29 2009, 18:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|