int minimal_digit(int n) { const int base = 10; int min_digit = 0; while (n>0) { int digit = n%base; if (digit < min_digit) min_digit = digit; n /= base; } return min_digit; }
int filter_digits(int n, int filter_by) { const int base = 10; int pow_base = 1; int result = 0;
if (filter_by == 0) { return n; }
while (n>0) { int digit = n%base; if (digit % filter_by != 0) { result += digit * pow_base; pow_base *= base; } n /= base; }
Двоичные операции применяются ко всем битам, стоящим на одинаковых местах:
- "или" (v): в результате стоит 1, если на этом месте хотя бы у одного из исходных чисел стоит 1. A v B = 10111_2 v 10011_2 = 10111_2 (например, на 3-м месте у А стоит 1, у B стоит 0, поэтому в результате там стоит 1)
- "и" (&): в результате стоит 1, если на этом месте у всех исходных чисел стоит 1. (A v B) & C = 10111_2 & 11010_2 = 10010_2 = 16 + 2 = 18.
int minimal_digit(int n)
{
const int base = 10;
int min_digit = 0;
while (n>0) {
int digit = n%base;
if (digit < min_digit)
min_digit = digit;
n /= base;
}
return min_digit;
}
int filter_digits(int n, int filter_by)
{
const int base = 10;
int pow_base = 1;
int result = 0;
if (filter_by == 0) {
return n;
}
while (n>0) {
int digit = n%base;
if (digit % filter_by != 0) {
result += digit * pow_base;
pow_base *= base;
}
n /= base;
}
return result;
}
int main()
{
int n;
std::cout << "Введите число n: " << std::endl;
std::cin >> n;
int digit = minimal_digit(n);
int result = filter_digits(n, digit);
std::cout << "ответ: " << result << std::endl;
return 0;
}
19 = 16 + 2 + 1 = 10011_2
26 = 16 + 8 + 2 = 11010_2
Двоичные операции применяются ко всем битам, стоящим на одинаковых местах:
- "или" (v): в результате стоит 1, если на этом месте хотя бы у одного из исходных чисел стоит 1.
A v B = 10111_2 v 10011_2 = 10111_2 (например, на 3-м месте у А стоит 1, у B стоит 0, поэтому в результате там стоит 1)
- "и" (&): в результате стоит 1, если на этом месте у всех исходных чисел стоит 1.
(A v B) & C = 10111_2 & 11010_2 = 10010_2 = 16 + 2 = 18.
ответ. 18.