Другие языки программирования и технологии

Pascal. Дан натуральный отрезок чисел [A,B]. Найти те числа этого отрезка, которые являются степенью двойки.

АА
Андрей А
109
Узнать, является ли натуральное число N степенью двойки можно:
— определив все значения определённого типа в константу-массив (как сказал предыдущий отвечающий)

const pow2 : array [1..32] of Longint = (1, 2, 4, 8, 16, …, 1073741824);

Res := false;
for i := 1 to 32 do Res := Res or N = pow2[ i ];
if Res then WriteLn('Да') else WriteLn('Нет');

— либо методом последовательного побитного смещения (делением на 2)

while Not Odd(N) do N := N shr 1;
if N = 1 then WriteLn('Да') else WriteLn('Нет');

На мой взгляд, второй способ проще и элегантнее!
АТ
Андрей Трокин
70 611
Лучший ответ
Ну и? Загони все степени двойки до 32-й в множество и проверяй наличие каждого элемента в этом множестве. Можно и через массив сделать.
С Е
С Е
67 395
Если 0 < A < B

N:=1; while N
Если отрезок достаточно мал - вышеприведённые способы подойдут. А если он содержит больше тысячи элементов (а тем более, если миллиарды) - тогда работать со всем множеством чисел не получится, и сравнивать рациональнее будет такой алгоритм:
1. Находим минимальную и максимальную степени двойки, вычислив логарифмы A и B по основанию 2.
2. Вывести 2 во все степени между числами, найденными в п. 1
var A, B: Cardinal; a2, b2, k: Byte; t: Real;
begin
//здесь прописать ввод A, B
t := log(A) / log(2);
if trunc(t) = t then a2 := t else a2 := t + 1;
b2 := trunc(log(B) / log(2));
for k := a2 to b2 do //вывод значения 2^k
end;

Похожие вопросы