М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
OlegBasov
OlegBasov
08.11.2021 11:50 •  Информатика

Укажите наибольшее натуральное трёхзначное число , при вводе которого будут напечатаны числа 1 и 2. #include int main() {
int x, a = 0, b = 0;
std::cin >> x;
while (x > 0) {
if (x % 8 % 3 > 1) a++;
if (x % 8 % 3 < 1) b++;
x /= 8;
}
std::cout << a << " " << b;
}

Что делает код, в принципе, понятно. Хотелось б алгоритм решения подобного для подбора числа.

👇
Ответ:
MrsVaderr
MrsVaderr
08.11.2021

949

Объяснение:

Так как каждый раз производится целочисленное деление на 8, удобно рассмотреть восьмеричную запись числа. Алгоритм анализирует последнюю цифру текущего значения: если при делении на 3 она даёт остаток 2, то увеличивается a; если остаток 0 — увеличивается b.

Приоритет подбора числа таков:

1. Количество цифр (чем больше цифр, тем больше число; если бы требовалось найти наименьшее число, мы бы первым делом уменьшали количество цифр);

2. Цифры слева направо (чтобы число было максимальным, нужно максимизировать самую первую цифру, затем вторую и т. д.; аналогично для поиска минимального числа — минимизируем слева направо).

Количество цифр уже известно — 3, но это применимо для числа в десятичной системе счисления. Пусть x — искомое число. Тогда 100_{10}\leq x_{10}\leq 999_{10}\Leftrightarrow 144_8\leq x_8\leq 1747_8. Максимальное количество цифр в его восьмеричной записи — 4. Попробуем подобрать четырёхзначное число.

Известно, что цифр с остатками при делении на 3, отличными от 1, ровно 3 (1 с остатком 2 и 2 с остатком 0). Первая цифра — это 1, больше быть не может. Она даёт остаток 1 и не влияет на a и b. Тогда остальные цифры не должны иметь остаток 1. Пусть вторая цифра — 7. Она даёт остаток 1, что не подходит. Тогда пусть вторая цифра — 6. Она даёт остаток 0, увеличивает b на 1. Аналогично третья цифра не может быть 7, а только 6. b снова увеличилось на 1 и стало равным 2. Значит, больше цифр с остатком 0 быть не может. Четвёртая цифра не может быть 7, 6. Пусть она равна 5. Тогда a увеличилось на 1, a = 1, b = 2. Искомое число — 1665₈ = 949₁₀.

4,6(55 оценок)
Открыть все ответы
Ответ:
//Dev-C++ 4.9.9.2

//а
#include <iostream>
using namespace std;

const int n=10;

int main(){
         int ar[n];
         int arsub[n];
         int m=0;
         cout<<"Enter m:";
         cin>>m;
         cout<<"Enter array:"<<endl;
         for(int i=0;i<n;i++)
          cin>>ar[i];
         for(int i=0;i<m;i++)
          arsub[i]=ar[i];
         for(int i=0;i<n-m;i++)
          ar[i]=ar[i+m];
         for(int i=0;i<m;i++)
          ar[i+(n-m)]=arsub[i];
         cout<<"Final array"<<endl;
         for(int i=0;i<n;i++)
          cout<<ar[i]<<' ';
        cin.get();
        cin.get();
 return 0;
}

//б
#include <iostream>
using namespace std;

const int n=10;

int main(){
         int ar[n];
         int arsub[n];
         int k,k1=0;
         cout<<"Enter k:";
         cin>>k;
         cout<<"Enter array:"<<endl;
         for(int i=0;i<n;i++)
          cin>>ar[i];
         for(int i=n-k;i<n;i++){
          arsub[k1]=ar[i];k1++;}
         for(int i=n;i>=k;i--)
          ar[i]=ar[i-k];
         for(int i=0;i<k;i++)
          ar[i]=arsub[i];
         cout<<"Final array"<<endl;
         for(int i=0;i<n;i++)
          cout<<ar[i]<<' ';
        cin.get();
        cin.get();
 return 0;
}
4,8(5 оценок)
Ответ:
aboboskayaovrain
aboboskayaovrain
08.11.2021
//Pascal ABC.NET 3.1 сборка 1219

Var
 f:text;
 ars:array of string;
 s,s1:string;
 min,n,i:integer;
begin
n:=1;
min:=integer.MaxValue;
assign(f,'text.txt');
reset(f);
while not(Eof(f)) do
 begin
  readln(f,s);
  s1:=s;
  s:=s.Trim;
  i:=1;
  while i<>length(s) do
    if (s[i]=' ') and (s[i+1]=' ') then delete(s,i,1) else inc(i);
  if ((s.split).length<=min) and ((s.split).length<>0) then
  begin
   if (s.split).length=min then
    begin
     inc(n);
     setlength(ars,n);
     ars[n-1]:=s1;
    end
    else
    begin
     n:=1;
     setlength(ars,n);
     ars[n-1]:=s1;
    end;
    min:=(s.split).length;
   end;
  end;
close(f);
assign(f,'text1.txt');
rewrite(f);
for i:=0 to n-1 do
writeln(f,ars[i]);
close(f);
end.

Содержимое файла text.txt:
Хей патимейкер
уличный
денсер
шейкер                   шейкер
Содержимое файла text1.txt:
уличный
денсер
4,6(94 оценок)
Это интересно:
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ