КИТА unofficial
Ноябрь 22, 2024, 09:54:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: "Искусство программирования" (задача 1)  (Прочитано 33612 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline 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 Offline

Пол: Мужской
Награды:
I место в фотоконкурсе \
Сообщений: 4636


не ^i^


« Ответ #1 : Февраль 08, 2007, 01:57:20 »

Проверяем младший бит. Возвращаем true если мл. бит 0, иначе false.

Извините без программного кода. Главное алгоритм %)
Записан

· Я русский ·
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #2 : Февраль 08, 2007, 02:03:23 »

grimgav - Ответ #1 -> твой алгоритм определяет четное число или нечетное. Число 6 по твоему алгоритму выдаст True, хотя оно не является степенью двойки.
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
grimgav
↑ так меня зовут, а это я говорю →
Просто гламурный
Проректор
*****

Карма: +161/-17
Offline Offline

Пол: Мужской
Награды:
I место в фотоконкурсе \
Сообщений: 4636


не ^i^


« Ответ #3 : Февраль 08, 2007, 02:05:52 »

grimgav - Ответ #1 -> твой алгоритм определяет четное число или нечетное. Число 6 по твоему алгоритму выдаст True, хотя оно не является степенью двойки.

Гыы %) shame on me )))
Записан

· Я русский ·
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #4 : Февраль 08, 2007, 04:27:38 »

У кого-нибудь есть вообще какие-нибудь соображения на эту тему?
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Storm
Верховный
Администратор
Аспирант
*****

Карма: +29/-0
Offline 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 Offline

Пол: Мужской
Сообщений: 1518



« Ответ #6 : Февраль 08, 2007, 07:54:18 »

ИМХО, за одинаковое количество команд ассемблера для 8,16, 32 и 64 битных целых не получится - обработка должна быть либо пословная либо побайтовая. Надо проверить на количество единиц в двоичном виде, если больше 1, то не степень.

В таком случае алгоритм зависит от конкретной реализации типов данных в двоичном представлении. ))
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #7 : Февраль 08, 2007, 08:10:16 »

Предложите какой-нибудь алгоритм, на его примере буду давать подсказки.
Надо от чего-то оттолкнуться.
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
EvilMax
Администратор
Завкаф
*****

Карма: +59/-0
Offline Offline

Пол: Мужской
Сообщений: 1072


Злой и страшный :)


« Ответ #8 : Февраль 08, 2007, 08:42:32 »

Я думаю, следует уточнить разрешенные при решении операции. Вычислить логарифм по основанию 2 и проверить, что его дробная часть равна 0 нехитро.
Записан

Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач...
---
Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #9 : Февраль 08, 2007, 09:01:38 »

Я думаю, следует уточнить разрешенные при решении операции. Вычислить логарифм по основанию 2 и проверить, что его дробная часть равна 0 нехитро.

А вычислить логарифм посредством элементарных операций сильно хитро? ))
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
EvilMax
Администратор
Завкаф
*****

Карма: +59/-0
Offline Offline

Пол: Мужской
Сообщений: 1072


Злой и страшный :)


« Ответ #10 : Февраль 08, 2007, 09:08:13 »

А вычислить логарифм посредством элементарных операций сильно хитро? ))
Вот поэтому и есть просьба уточнить задание.
Записан

Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач...
---
Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
Sterh
Сюрреалист
Проректор
*****

Карма: +221/-19
Offline Offline

Награды:
За победу в конкурсе поэзии (весна-2007)За I-II место в фотоконкурсе \За I-II место в фотоконкурсе \За III место в фотоконкурсе \За I место в фотоконкурсе \
Сообщений: 6696


...Стерх...


WWW
« Ответ #11 : Февраль 09, 2007, 02:54:07 »

Предложите какой-нибудь алгоритм, на его примере буду давать подсказки.
Надо от чего-то оттолкнуться.

А что тут непонятного?
Storm предложил хороший вариант!
Я - За =Р

з.ы. Storm - требуй плюсик Подмигивающий и Канары! ))
Записан

"иногда мне нравится думать, что я - маленький зеленый гоблин, который прячется в теле рыжей девочки, и очень горд тем, как он всех обманул"
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline 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 Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #13 : Февраль 09, 2007, 11:40:45 »

Sterh -> плюсика еще рано Улыбка

Storm указал на суть задачи, все дело в битовом представлении чисел.

Если кому-то несложно, то напишите плиз несколько чисел степени двойки, в двоичном представлении. Потом несколько чисел, которые больше этого числа, и несколько чисел которые меньше этого числа. Это подсказка.
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
BODROV
Mодератор
Доцент
*****

Карма: +37/-1
Offline Offline

Пол: Мужской
Сообщений: 550


хде я?


« Ответ #14 : Февраль 09, 2007, 11:56:19 »

Если кому-то несложно, то напишите плиз несколько чисел степени двойки, в двоичном представлении. Потом несколько чисел, которые больше этого числа, и несколько чисел которые меньше этого числа. Это подсказка.
не, ну то, что число степени двойки в двоичном виде - это единица и нолики (10, 100, 1000) эт ясно. но меня чет сбило с толку это:
3. Время проверки НЕ ДОЛЖНО зависеть от типа проверяемой переменной (byte, short, int, long int) и НЕ ДОЛЖНО зависеть от величины проверяемой переменной.
Записан
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #15 : Февраль 09, 2007, 12:42:44 »

Storm - Ответ #5 -> Мдааа.. ну это слишком глубоко пошло. Конечно элементарные операции для байтов, слов и двоичных слов будут использовать различное машинное время, хотя для современных процессоров все может уложится в один такт Улыбка
Хе-хе.
Цитировать
Примечания: ответы типа "у меня на P4-3000Mhz время одинаковое" - не принимаются.
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #16 : Февраль 09, 2007, 01:39:52 »

ОК, давайте вопрос о типах данных пока замнем. Поговорим о нем когда увидите решение. Условно можно принять тип данных int.

Однако решение, которое я знаю, точно самое оптимальное и его скорость не зависит от величины проверяемой переменной.

Мою подсказку(ответ #13) проигнорировали полностью....
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
BODROV
Mодератор
Доцент
*****

Карма: +37/-1
Offline Offline

Пол: Мужской
Сообщений: 550


хде я?


« Ответ #17 : Февраль 09, 2007, 02:23:52 »

есть идея, только проверять не хочеться Улыбка
х - заданное число
если ((х-1) xor (x)) равно ((x-1)+x) тогда это степень двойки
Записан
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #18 : Февраль 09, 2007, 02:40:35 »

Проверять не хочется - тогда я буду вам компилятором чтоли?
BODROV - Ответ #17 -> молодец, это правильное направление.

Надо упростить: заменить некоторые операторы, а другие ваще убрать. И напишите программным кодом, как-нибудь стандартизировано - дело надо до конца доводить.
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
BODROV
Mодератор
Доцент
*****

Карма: +37/-1
Offline 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;
время так и не получилось посчитать, давно не кодил - не помню, а разбираться нет времени
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.26 секунд. Запросов: 35.