Задача. Автомат обрабатывает натуральное число N (1<=N<=255) по следующему алгоритму:
- Строится восьмибитная двоичная запись числа.
- Все цифры двоичной записи заменяются на противоположные (1 на 0, 0 на 1).
- Полученное число переводится в десятичную запись.
- Из нового числа вычитается исходное, полученная разность выводится на экран.
Какое число нужно ввести в автомат, чтобы в результате получилось 125?
В первую очередь разберемся, как инвертировать двоичную строку.
Воспользуемся методом Replace для того, чтобы заменить все подстроки на другие.
Пример:
s:='ОРИСОРИС';
s:=s.replace('РИС','ЛА');
Результат: s = ОЛАОЛА
Все подстроки РИС заменились на подстроки ЛА.
Тогда чтобы инвертировать двоичный код, нужно заменить все символы 1 на *, затем все символы 0 на символы 1, а затем все символы * на символы 0.
Пусть s = 101
1) все символы 1 заменим на *
s = *0*
2) все символы 0 заменим на 1
s = *1*
3) все символы * заменим на 0
s = 010
Сделаем это в одну строку:
s:=s.replace('1','*').replace('0','1').replace('*','0');
Как будем решать задачу
- Запустим цикл по числам N
- Выполним перевод числа N в двоичную систему счисления
- Доведем разрядность двоичного кода до 8 (число восьмибитное)
- Инвертируем полученное двоичное число
- Выполним перевод полученной строки в десятичную систему счисления
- Вычислим разность нового числа и исходного
- Выполним проверку, если разность равна 125, то выводим число N на экран
uses school;
var n,n1:integer; s,s1:string;
begin
for n:=1 to 255 do
begin
s:=bin(n);
s:='0'*(8-s.Length)+s;
s1:=s.Replace('1','*').Replace('0','1').Replace('*','0');
n1:=dec(s1,2);
//println(s,s1);
if n1-n=125 then println(n);
end;
end.
Ответ: 65
Комментариев нет:
Отправить комментарий