реклама на сайте
подробности

 
 
> Помогите с алгоритмом!, проверка элементов массива на кратность 2^k
Gabe
сообщение May 27 2009, 13:30
Сообщение #1





Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629



Помогите с алгоритмом, пожалуйста!
Нужно организовать проверку элементов массива на кратность 2^k, где k=1...4 unsure.gif

Делаю на ассемблере

Сообщение отредактировал Gabe - May 27 2009, 13:31
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rst7
сообщение May 29 2009, 09:34
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Да, но вычислителя остатка при делении на 5 там нет.


Вот черт. Действительно... Хотя - это не вопрос. Умножаем вход на 3 и делим на 15 smile.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
SKov
сообщение May 29 2009, 12:51
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119



Цитата(Rst7 @ May 29 2009, 13:34) *
Вот черт. Действительно... Хотя - это не вопрос. Умножаем вход на 3 и делим на 15 smile.gif

Все прально, только умножать не надо wink.gif
А делить можно и на 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 в одном-двух местах wink.gif
Правда, смысл первых строчек уже не помню...
Вот! Вспомнил наконец!
Общая идея, которой я руководствовался в детстве при написании этих программ, заключается в том,
что из числа можно вычесть любое число, кратное делителю, и при этом остаток от деления не изменится.
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 29 2009, 14:06
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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 + В
Go to the top of the page
 
+Quote Post
SKov
сообщение May 29 2009, 14:26
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 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 + В

Ну вы тут и накрутили на ровном месте wink.gif
Все намного проще:
R= k % 5 = (A*255 + В) % 5 = B%5
В первой строчке делается первый шаг поиска остатка от деления на 255.
В результате получаем некое B, которое значительно меньше исходного числа. И т.д.
Идея в том, что можно сначала искать модуль для бОльшего делителя, а затем работать с маленьким остатком дальше.
Главное условие в том, чтобы этот бОльший делитель был кратным маленькому делителю, для которого нас интересует конечный результат.
Нам подходят числа 15 и 255 в качестве бОльших делителей потому что
а) Для них легко искать остаток от деления
б) Они делятся на 5 нацело.
Ч.т.д.
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 29 2009, 14:43
Сообщение #6


Гуру
******

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



Цитата(SKov @ May 29 2009, 17:26) *
Ну вы тут и накрутили на ровном месте wink.gif
Все намного проще:
R= k % 5 = (A*255 + В) % 5 = B%5
Ну, тогда уж так:
R= k % 5= (А*256 + В) % 5= (А*255 + А + В) % 5= ((А*255)%5 + А + В) % 5= (А + В) % 5, поскольку (А*255) % 5= 0
Go to the top of the page
 
+Quote Post
SKov
сообщение May 29 2009, 14:51
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119



Цитата(Палыч @ May 29 2009, 18:43) *
Ну, тогда уж так:
R= k % 5= (А*256 + В) % 5= (А*255 + А + В) % 5= ((А*255)%5 + А + В) % 5= (А + В) % 5, поскольку (А*255) % 5= 0


Ну, осталось только замену переменных сделать A+B=b и получится ровно то,
что у меня записано, только заметно короче. wink.gif
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 29 2009, 15:00
Сообщение #8


Гуру
******

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



Цитата(SKov @ May 29 2009, 17:51) *
Ну, осталось только замену переменных сделать A+B=b и получится ровно то, что у меня записано, только заметно короче. wink.gif
Согласен. Только помните, что спорим мы в разделе для начинающих, и не каждый дружен с математикой настолько, чтобы представить двоичное число в виде k= A*255+b, ведь 255 - это не степень двойки
Go to the top of the page
 
+Quote Post
SKov
сообщение May 29 2009, 15:37
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119



Цитата(Палыч @ May 29 2009, 19:00) *
Согласен. Только помните, что спорим мы в разделе для начинающих, и не каждый дружен с математикой настолько, чтобы представить двоичное число в виде k= A*255+b, ведь 255 - это не степень двойки

А причем здесь двоичное число и способ его представления?
Все что мы писали в наших постах справедливо для десятичных чисел,
вполне доступных для понимания даже начинающих.
И в моих функциях используются исключительно десятичные числа.
Или я не понял замечания? wink.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 15:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016