Алгоритмы в нашей жизни Любой человек ежедневно встречается с множеством задач: от самых простых и хорошо известных до очень сложных. Для многих задач существуют определенные правила (инструкции, предписания), объясняющие исполнителю, как решать данную задачу. Эти правила человек может изучить заранее или сформулировать сам в процессе решения задачи. Чем точнее и понятнее будут описаны правила решения задач, тем быстрее человек овладеет ими и будет эффективнее их применять. Решение многих задач человек может передавать техническим устройствам - автоматам, роботам, компьютерам. Применение таких технических устройств предъявляет очень строгие требования к точности описания правил и последовательности выполнения действий. Поэтому разрабатываются специальные языки для четкого и строгого описания различных правил. Это одна из задач информатики. Каждый из нас ежедневно использует различные алгоритмы: инструкции, правила, рецепты и т. п. Обычно мы это делаем не задумываясь. Например, открывая дверь ключом, никто не размышляет над тем, в какой последовательности выполнять действия. Однако, чтобы кого – нибудь (скажем, младшего брата) научить открывать дверь, придется четко указать и сами действия, и порядок их выполнения. Например, так: Достать ключ. Вставить ключ в замочную скважину. Повернуть ключ 2 раза против часовой стрелки. Вынуть ключ. А теперь представьте себе, что вас пригласили в гости. Наверняка вы попросите подробно и точно объяснить, как добраться. Вот как может выглядеть объяснение: Выйти из дома. Повернуть направо. Пройти 2 квартала до автобусной остановки.. Сесть в автобус № 25, идущий к центру города. Проехать 3 остановки. Выйти из автобуса. Посмотрим на эти алгоритмы. На первый взгляд, между ними нет ничего общего. Одно дело – открывать дверь, другое – ехать в гости. Однако если приглядеться внимательно, можно заметить существенное сходство между ними. Прежде всего, это строгий порядок выполнения действий. Давайте переставим в первом алгоритме второе и третье действия: Достать ключ. Повернуть ключ 2 раза против часовой стрелки. Вставить ключ в замочную скважину. Вынуть ключ. Вы, конечно, сможете выполнить и этот алгоритм. Но дверь вряд ли откроется. А что произойдет, если поменять местами четвертое и пятое действия во втором алгоритме? Он станет невыполнимым! Итак, мы убедились, что для алгоритма важен не только набор действий, но и то, как они организованы, т. е. в каком порядке выполняются. Мы можем теперь сказать, что алгоритмы - это строго определенная последовательность действий. Существует очень много определений понятия алгоритм. И надо подчеркнуть, что в информатике это понятие является основным. Таким же, какими являются понятия точки, прямой и плоскости в геометрии, пространства и времени в физике, вещества в химии. Поэтому мы не сможем дать полное определение алгоритма, а будем уточнять смысл этого понятия на примерах.
Любой человек ежедневно встречается с множеством задач: от самых простых и хорошо известных до очень сложных. Для многих задач существуют определенные правила (инструкции, предписания), объясняющие исполнителю, как решать данную задачу. Эти правила человек может изучить заранее или сформулировать сам в процессе решения задачи. Чем точнее и понятнее будут описаны правила решения задач, тем быстрее человек овладеет ими и будет эффективнее их применять.
Решение многих задач человек может передавать техническим устройствам - автоматам, роботам, компьютерам. Применение таких технических устройств предъявляет очень строгие требования к точности описания правил и последовательности выполнения действий. Поэтому разрабатываются специальные языки для четкого и строгого описания различных правил. Это одна из задач информатики.
Каждый из нас ежедневно использует различные алгоритмы: инструкции, правила, рецепты и т. п. Обычно мы это делаем не задумываясь. Например, открывая дверь ключом, никто не размышляет над тем, в какой последовательности выполнять действия. Однако, чтобы кого – нибудь (скажем, младшего брата) научить открывать дверь, придется четко указать и сами действия, и порядок их выполнения. Например, так:
Достать ключ.
Вставить ключ в замочную скважину.
Повернуть ключ 2 раза против часовой стрелки.
Вынуть ключ.
А теперь представьте себе, что вас пригласили в гости. Наверняка вы попросите подробно и точно объяснить, как добраться. Вот как может выглядеть объяснение:
Выйти из дома.
Повернуть направо.
Пройти 2 квартала до автобусной остановки..
Сесть в автобус № 25, идущий к центру города.
Проехать 3 остановки.
Выйти из автобуса.
Посмотрим на эти алгоритмы. На первый взгляд, между ними нет ничего общего. Одно дело – открывать дверь, другое – ехать в гости. Однако если приглядеться внимательно, можно заметить существенное сходство между ними. Прежде всего, это строгий порядок выполнения действий. Давайте переставим в первом алгоритме второе и третье действия:
Достать ключ.
Повернуть ключ 2 раза против часовой стрелки.
Вставить ключ в замочную скважину.
Вынуть ключ.
Вы, конечно, сможете выполнить и этот алгоритм. Но дверь вряд ли откроется. А что произойдет, если поменять местами четвертое и пятое действия во втором алгоритме? Он станет невыполнимым! Итак, мы убедились, что для алгоритма важен не только набор действий, но и то, как они организованы, т. е. в каком порядке выполняются.
Мы можем теперь сказать, что алгоритмы - это строго определенная последовательность действий. Существует очень много определений понятия алгоритм. И надо подчеркнуть, что в информатике это понятие является основным. Таким же, какими являются понятия точки, прямой и плоскости в геометрии, пространства и времени в физике, вещества в химии. Поэтому мы не сможем дать полное определение алгоритма, а будем уточнять смысл этого понятия на примерах.
ответ:Вариант №1 (не совсем удачный, как было отмечено в комментариях).
//PascalABC.NET (версия 3.1, сборка 1210 от 29.03.2016)
var n,i,m:integer;
flag:boolean;
begin
readln(n);
flag:=false;
if (n mod 2<>0)then i:=n-1 else i:=n;
while i>0 do begin
if power(2,i)<=n then begin
write(power(2,i),' '); flag:=true;
end;
i:=i-2;
end;
if not flag then writeln(0);
end.
Тест №1
1025
1024 256 64 16 4
Тест №2
1
0
Вариант №2
var a,i,n: integer;
begin
a:=1;readln(n);
i:=trunc(log2(n)); //получим степень двойки для n
//если i нечетное,
//то первое искомое число получаем путем сдвига влево на i-1 в
//двоичном представлении числа иначе сдвиг на i
if (i mod 2)=1 then a:=a shl(i-1) else a:=a shl i;
//далее получаем числа сдвигая вправо на 2 разряда
//в двоичном представлении числа
while a>=2 do begin
write(a,' ');
a:=a shr 2;
end;
end.
Тестовое решение:
2147483647
1073741824 268435456 67108864 16777216 4194304 1048576 262144 65536 16384 4096 1024 256 64 16 4