Узнать, является ли натуральное число 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('Нет');
На мой взгляд, второй способ проще и элегантнее!
Другие языки программирования и технологии
Pascal. Дан натуральный отрезок чисел [A,B]. Найти те числа этого отрезка, которые являются степенью двойки.
Ну и? Загони все степени двойки до 32-й в множество и проверяй наличие каждого элемента в этом множестве. Можно и через массив сделать.
Если 0 < A < B
N:=1; while N
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;
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;
Похожие вопросы
- Pascal . Дан массив вещественных чисел. Найти сумму элементов, номера которых являются простыми числами
- Pascal. Дана строка, элементы - числа через пробел. Как отсечь числа, которые содержат '0'?
- TurboPascal. Дана матрица целых чисел. Возвести её во вторую степень, вывести исходную и полученную матрицы
- 9. Даны натуральные числа A, B и C, обозначающие число, месяц и год. Проверить корректность этой даты. Выбрать оптимальн
- Pascal. Даны координаты начала и конца отрезка. Определить координаты всех точек этого отрезка.
- Паскаль! Даны векторы: a={xn}, b={yn}, c={zn}, d={dn}. Построить матрицу К, сторонами которой являются упорядочены в
- Программисты! Помогите пожалуйста! Нужно на паскале написать код к следующей задаче: Даны натуральные числа a, b, c
- Найти трехзначные числа a, b, c, все цифры которых различны и удовлетворяют уравнению a^2 – b^2 – c^2 = a – b – c.
- Даны натуральные числа N и A1,…, AN. Образовать новые одномерные последовательности B1, …, BN и C1, …, CN
- даны 3 разл целых числа a,b,c используя оператор GOTO составить программу для ввода чисел в порядке убывания