vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« : Февраль 08, 2007, 01:52:38 » |
|
Вопрос №1: Написать подпрограмму, проверяющую, является ли число степенью 2 (т.е. числа 2=21, 4=22, 8=23, 16=24 и т.д.). Условия: 1. Реализацию этого алгоритма можно предложить на любом языке программирования. Алгоритм должен выдавать Да/Нет (т.е 0/1, True/False кому как удобнее). Мой ответ на ANSI С. 2. Подпрограмма должна быть оптимизирована по времени (т.е. минимальное время выполнения). 3. Время проверки НЕ ДОЛЖНО зависеть от типа проверяемой переменной (byte, short, int, long int) и НЕ ДОЛЖНО зависеть от величины проверяемой переменной.
Примечания: ответы типа "у меня на P4-3000Mhz время одинаковое" - не принимаются.
|
|
« Последнее редактирование: Февраль 22, 2007, 08:33:24 от vimmax »
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
grimgav
↑ так меня зовут, а это я говорю →
Просто гламурный
Проректор
Карма: +161/-17
Offline
Пол: Награды:
Сообщений: 4636
не ^i^
|
|
« Ответ #1 : Февраль 08, 2007, 01:57:20 » |
|
Проверяем младший бит. Возвращаем true если мл. бит 0, иначе false.
Извините без программного кода. Главное алгоритм %)
|
|
|
Записан
|
· Я русский ·
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #2 : Февраль 08, 2007, 02:03:23 » |
|
grimgav - Ответ #1 -> твой алгоритм определяет четное число или нечетное. Число 6 по твоему алгоритму выдаст True, хотя оно не является степенью двойки.
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
grimgav
↑ так меня зовут, а это я говорю →
Просто гламурный
Проректор
Карма: +161/-17
Offline
Пол: Награды:
Сообщений: 4636
не ^i^
|
|
« Ответ #3 : Февраль 08, 2007, 02:05:52 » |
|
grimgav - Ответ #1 -> твой алгоритм определяет четное число или нечетное. Число 6 по твоему алгоритму выдаст True, хотя оно не является степенью двойки.
Гыы %) shame on me )))
|
|
|
Записан
|
· Я русский ·
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #4 : Февраль 08, 2007, 04:27:38 » |
|
У кого-нибудь есть вообще какие-нибудь соображения на эту тему?
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
Storm
Верховный
Администратор
Аспирант
Карма: +29/-0
Offline
Пол:
Сообщений: 484
|
|
« Ответ #5 : Февраль 08, 2007, 07:43:05 » |
|
ИМХО, за одинаковое количество команд ассемблера для 8,16, 32 и 64 битных целых не получится - обработка должна быть либо пословная либо побайтовая. Надо проверить на количество единиц в двоичном виде, если больше 1, то не степень.
|
|
|
Записан
|
Только две вещи бесконечны: вселенная и тупость, и я еще не уверен по поводу вселенной. (Альберт Эйнштейн) ---------------------------------------------------- "There are two major products that came out of Berkeley: LSD and UNIX. We don't believe this to be a coincidence." (с) Jeremy S. Anderson
Проходит ирландец мимо паба....
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #6 : Февраль 08, 2007, 07:54:18 » |
|
ИМХО, за одинаковое количество команд ассемблера для 8,16, 32 и 64 битных целых не получится - обработка должна быть либо пословная либо побайтовая. Надо проверить на количество единиц в двоичном виде, если больше 1, то не степень.
В таком случае алгоритм зависит от конкретной реализации типов данных в двоичном представлении. ))
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #7 : Февраль 08, 2007, 08:10:16 » |
|
Предложите какой-нибудь алгоритм, на его примере буду давать подсказки. Надо от чего-то оттолкнуться.
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #8 : Февраль 08, 2007, 08:42:32 » |
|
Я думаю, следует уточнить разрешенные при решении операции. Вычислить логарифм по основанию 2 и проверить, что его дробная часть равна 0 нехитро.
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #9 : Февраль 08, 2007, 09:01:38 » |
|
Я думаю, следует уточнить разрешенные при решении операции. Вычислить логарифм по основанию 2 и проверить, что его дробная часть равна 0 нехитро.
А вычислить логарифм посредством элементарных операций сильно хитро? ))
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #10 : Февраль 08, 2007, 09:08:13 » |
|
А вычислить логарифм посредством элементарных операций сильно хитро? ))
Вот поэтому и есть просьба уточнить задание.
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Sterh
|
|
« Ответ #11 : Февраль 09, 2007, 02:54:07 » |
|
Предложите какой-нибудь алгоритм, на его примере буду давать подсказки. Надо от чего-то оттолкнуться.
А что тут непонятного? Storm предложил хороший вариант! Я - За =Р з.ы. Storm - требуй плюсик и Канары! ))
|
|
|
Записан
|
"иногда мне нравится думать, что я - маленький зеленый гоблин, который прячется в теле рыжей девочки, и очень горд тем, как он всех обманул"
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #12 : Февраль 09, 2007, 11:35:13 » |
|
Вычислить логарифм по основанию 2 и проверить, что его дробная часть равна 0 нехитро.
EvilMax - Ответ #8 -> а есть ли гарантия что операция вычисления логарифма не зависит от типа переменной и от величины числа? Ты ведь не знаешь реализацию кода этой функции. ИМХО, за одинаковое количество команд ассемблера для 8,16, 32 и 64 битных целых не получится - обработка должна быть либо пословная либо побайтовая. Надо проверить на количество единиц в двоичном виде, если больше 1, то не степень.
Storm - Ответ #5 -> Мдааа.. ну это слишком глубоко пошло. Конечно элементарные операции для байтов, слов и двоичных слов будут использовать различное машинное время, хотя для современных процессоров все может уложится в один такт
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #13 : Февраль 09, 2007, 11:40:45 » |
|
Sterh -> плюсика еще рано Storm указал на суть задачи, все дело в битовом представлении чисел. Если кому-то несложно, то напишите плиз несколько чисел степени двойки, в двоичном представлении. Потом несколько чисел, которые больше этого числа, и несколько чисел которые меньше этого числа. Это подсказка.
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
BODROV
Mодератор
Доцент
Карма: +37/-1
Offline
Пол:
Сообщений: 550
хде я?
|
|
« Ответ #14 : Февраль 09, 2007, 11:56:19 » |
|
Если кому-то несложно, то напишите плиз несколько чисел степени двойки, в двоичном представлении. Потом несколько чисел, которые больше этого числа, и несколько чисел которые меньше этого числа. Это подсказка.
не, ну то, что число степени двойки в двоичном виде - это единица и нолики (10, 100, 1000) эт ясно. но меня чет сбило с толку это: 3. Время проверки НЕ ДОЛЖНО зависеть от типа проверяемой переменной (byte, short, int, long int) и НЕ ДОЛЖНО зависеть от величины проверяемой переменной.
|
|
|
Записан
|
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #15 : Февраль 09, 2007, 12:42:44 » |
|
Storm - Ответ #5 -> Мдааа.. ну это слишком глубоко пошло. Конечно элементарные операции для байтов, слов и двоичных слов будут использовать различное машинное время, хотя для современных процессоров все может уложится в один такт Хе-хе. Примечания: ответы типа "у меня на P4-3000Mhz время одинаковое" - не принимаются.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #16 : Февраль 09, 2007, 01:39:52 » |
|
ОК, давайте вопрос о типах данных пока замнем. Поговорим о нем когда увидите решение. Условно можно принять тип данных int.
Однако решение, которое я знаю, точно самое оптимальное и его скорость не зависит от величины проверяемой переменной.
Мою подсказку(ответ #13) проигнорировали полностью....
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
BODROV
Mодератор
Доцент
Карма: +37/-1
Offline
Пол:
Сообщений: 550
хде я?
|
|
« Ответ #17 : Февраль 09, 2007, 02:23:52 » |
|
есть идея, только проверять не хочеться х - заданное число если ((х-1) xor (x)) равно ((x-1)+x) тогда это степень двойки
|
|
|
Записан
|
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #18 : Февраль 09, 2007, 02:40:35 » |
|
Проверять не хочется - тогда я буду вам компилятором чтоли? BODROV - Ответ #17 -> молодец, это правильное направление.
Надо упростить: заменить некоторые операторы, а другие ваще убрать. И напишите программным кодом, как-нибудь стандартизировано - дело надо до конца доводить.
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
BODROV
Mодератор
Доцент
Карма: +37/-1
Offline
Пол:
Сообщений: 550
хде я?
|
|
« Ответ #19 : Февраль 09, 2007, 04:12:27 » |
|
гы, подправил procedure TForm1.Button1Click(Sender: TObject); var x: longint; begin x:=strtoint(edit1.text); if ((x-1) xor x) = ((x shl 1)-1) then label1.Caption:='true' else label1.Caption:='false'; end;
время так и не получилось посчитать, давно не кодил - не помню, а разбираться нет времени
|
|
|
Записан
|
|
|
|
|