PascalABC.NET
Ответ:
- function ToBinary (x:integer):string;
- begin
- if (x>0) then ToBinary := ToBinary(x div 2) + (x mod 2).ToString;
- end;
-
- function FromBinary (x:string):integer;
- begin
- if (x.Length>0) then FromBinary := FromBinary(x.Substring(1)) + x[1].ToDigit*Round(Power(2,x.Length-1));
- end;
-
- function func (x:integer):integer;
- begin
- var s := ToBinary(x);
- loop 2 do s += s.AsEnumerable.Sum(c->c.ToDigit) mod 2;
- func:=FromBinary(s);
- end;
-
- begin
- Println('f(N):',func(ReadInteger('N:')));
- Println('Количество:',(1..160).Count(x->func(x) in 90..160));
- end.
Примечание:
Если к числу в двоичной системе счисления приписывать в конец цифры, то число увеличивается и никак не может уменьшится. Поэтому, n Следовательно, перебор различных чисел, принадлежащих отрезку [90;160], можно смело ставить до 160 (можно и меньше, но лень расписывать вычисления).
ToBinary - функция перевода числа из десятичной СС в двоичную. Можно писать любой алгоритм, необязательно в точности использовать мой.
FromBinary - функция перевода числа из двоичной СС в десятичную. Можно писать любой алгоритм, необязательно в точности использовать мой.
func - функция, которая выполняет преобразования числа согласно условию (пункты 1, 2, 3, 4).
Код кажется большим только из-за процедур и begin/endов. Без них - всего то 7 строчек :). В скринах можно проверить, действительно ли 19 (40-22+1).
Пример работы: