С++14
Код:
#include <iostream>#include <iomanip>#include <string>#include <algorithm> size_t count_char(const std::string& number, char c) { return std::count(number.begin(), number.end(), c);} bool is_it_more_than(const std::string& number, char a, char b) { return count_char(number, a) > count_char(number, b);}int main() { long long k = 4353621ll; char a = '3'; char b = '4'; std::string number = std::to_string(k); std::cout << "Number is " << number << std::endl; std::cout << "a = " << a << std::endl; std::cout << "b = " << b << std::endl; std::cout << "Does a appear in Number more often than b: " << std::boolalpha << is_it_more_than(number, a, b) << std::endl; return 0;}Число в двоичной системе счисления выглядит как единица и n нулей за ней.
То есть у числа ровно 1533 значащих нуля, а у числа
их ровно 1022.
Разница же таких чисел порождает единицы между первыми единицами изначальных чисел. Например, . Появилось 5-3 = 2 единицы и осталось 3 (от последнего числа) значащих нуля.
Зная это, мы можем разобраться, сколько значащих нулей в загаданном числе.
даёт нам 1022 значащих 0 и 511 единиц перед ними.
даёт нам 9 значащих 0 и 502 единицы перед ними.
даёт нам 0 значащих 0 и 1 единицу перед ними (просто единица).
Теперь сложение.
Начинаем с самых больших разрядов. Понижаясь, вычитаем количество образовавшихся в середине единиц.
1022 - 502 - 1 = 519 - ответ.
begin
writeln ('Введите два числа');
read(a,b);
if a=b then a:=0
else
begin
a:=-1*a; b:=-1*b;
end;
writeln(a,' ',b);
end.