@IndusDev

Задача «Бинарные числа»?

Решаю данную олимпиадную задачу:
Задано целое число N. Требуется определить, является ли оно бинарным.

Входные данные
Входной файл INPUT.TXT содержит единственное целое число N, не превосходящее 10000 по абсолютной величине.

Выходные данные
В выходной файл OUTPUT.TXT выведите YES, если заданное число является бинарным, и NO в противном случае.


Вот мое решение:
var N,k: integer;

begin
  read(N);
  while(N > 1) do
    begin
      if(N mod 2 = 1) then
        begin
          write('NO');
          exit();
        end;
      if(N mod 2 = 0) then
        begin
          N:=N div 2;
        end;
    end;
  write('YES');
end.


Пробовал решить по разному, добавлять какие-то условия, но всегда проваливается решение на каком-то тесте.
Что не так?
  • Вопрос задан
  • 2916 просмотров
Решения вопроса 2
@Mercury13
Программист на «си с крестами» и не только
(n > 0) and (n and (n - 1) = 0)
Раз у вас паскаль, первый AND логический, второй битовый.
Второе условие — стандартный программистский приём, срезающий последний единичный бит.

UPD2. Да, ты меня слегка перехитрил с алгоритмом, но, нем не менее…
1. Если число <= 0 — без единой итерации пишет YES, что неверно.
2. Если у вас условие сложное — лучше разделить программу на проверку условия (подпрограмму или переменную типа boolean) и реакцию на это условие.
3. Стандартная ошибка начинающих: допустим, не сработало условие N mod 2 = 1. Зачем писать N mod 2 = 0, если есть else?
Ответ написан
longclaps
@longclaps
Да уж, что-то не так.
Их всего-то 14 чисел, [1,2,4,8,16,...1024,2048,4096,8192], а в паскале для такого случая есть отличный оператор case - но ты упорно лепишь горбатого.
Расскажи нам, зачем?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы