234) Автомат обрабатывает десятичное натуральное число N по следующему алгоритму.
1. Строится двоичная запись числа,
2. К полученному числу справа дописывается 0, если в числе единиц больше, чем нулей, и 1 в обратном случае.
3. Из середины двоичного числа убирается 2 разряда, если количество разрядов получилось четным, и 3 разряда, если нечетное.
4. Полученное число переводится в десятичную систему счисления и является результатом работы автомата.
Сколько различных значений может получиться на отрезке [50; 100] в результате работы автомата?
Во-первых, я не совсем однозначно понимаю в п.2 слова "и 1 в обратном случае". Обратным случаем подразумевается то, когда в числе кол-во(1)<кол-во(0) или кол-во(1)<=кол-во(0)
Это конечно на ответе не сыграет огромную роль, но в ответе число 13 не может никаким образом получиться
Вот программа со всеми числами и каждым этапом, достаточно просто запустить.
#include <bits/stdc++.h>
using namespace std;
int main()
{
setlocale(LC_ALL,"Russian");
cout<<"Число\tВ двоичной\tПосле добавления 0 или 1\tПосле удаления цифр"<<endl;
vector<string> s;
for(int i=50;i<=100;i++)
{
int j=i;
string a="";
while(j!=0){ a=a+char(j%2+'0'); j/=2; }
reverse(a.begin(),a.end());
cout<<i<<"\t"<<a;
int k0=0,k1=0;
for(int l=0;l<a.size();l++)
if(a[ l]=='0') k0++;
else k1++;
if(k1>k0) a=a+'0';
else if(k1<k0) a=a+'1'; //Если всё-таки имелось ввиду, что количество единиц меньше или равно количества нулей, то необходимо просто стереть "if(k1<k0)"
cout<<"\t\t\t"<<a<<"\t\t\t";
int p=a.size();
if(p%2==0)
a.erase(a.begin()+p/2-1,a.begin()+p/2+1);
else a.erase(a.begin()+p/2-1,a.begin()+p/2+2);
cout<<a<<endl;
int k=0;
for(int l=0;l<s.size();l++)
if(s[ l]==a) {k++; break;}
if(k==0) s.push_back(a);
}
cout<<endl<<endl<<"Количество различных чисел: "<<s.size()<<endl;
for(int l=0;l<s.size();l++)
cout<<s[ l]<<endl;
}
Соответственно правильный ответ либо 20, либо 21.