Помогите решить задачу используя побитовые операции пожалуйста.
Дано длинное беззнаковое число Х. Необходимо найти максимальную и вторую максимальную цифру восьмеричного представления числа Х
C/C++
C++ побитовые операции
Описание алгоритма:
1. Число n>0 объявляем восьмибайтным беззнаковым целым типа unsigned long long. Объявляем массив для цифр восьмеричного представления числа n. В десятичном представлении у таких чисел не более двадцати цифр, а для восьмеричного представления - чуть больше, но можно длину массива взять и подлиннее, например, 50 (чтоб с запасом было, так сказать !). Реально получающееся количество цифр числа n обозначим k, оно будет вычисляться в ходе работы программы, а очередные цифры восьмеричного представления числа n будут заноситься в массив d (от слова digits - цифры) в итерационном цикле, количество шагов которого заранее неизвестно. В том же цикле будет определяться и максимальная цифра max.
2. Когда все цифры уже получены и известна максимальная из них, остаётся только найти субмаксимальную цифру, если она вообще есть! Возьмём к примеру, число 9(10). В восьмеричном представлении оно записывается как 11(8) - у ней только одна максимальная цифра, а второй нет. Так вот, максимальную цифру max печатаем сразу после первого итерационного цикла while. А вторую максимальную цифру submax печатаем после второго параметрического цикла for, если она вообще есть, и не печатаем, если её нет.
3. Побитовые операции используются такие: получение очередной цифры восьмеричного представления числа n - это n&7, а деление на 8 - это n>>=3.
P.S. Пара разных циклов здесь для разнообразия, а массив - для простоты. Если кто-то придумает лучше, проще и эффективнее - пусть напишет своё решение, если ума хватит!
。◕‿◕。

1. Число n>0 объявляем восьмибайтным беззнаковым целым типа unsigned long long. Объявляем массив для цифр восьмеричного представления числа n. В десятичном представлении у таких чисел не более двадцати цифр, а для восьмеричного представления - чуть больше, но можно длину массива взять и подлиннее, например, 50 (чтоб с запасом было, так сказать !). Реально получающееся количество цифр числа n обозначим k, оно будет вычисляться в ходе работы программы, а очередные цифры восьмеричного представления числа n будут заноситься в массив d (от слова digits - цифры) в итерационном цикле, количество шагов которого заранее неизвестно. В том же цикле будет определяться и максимальная цифра max.
2. Когда все цифры уже получены и известна максимальная из них, остаётся только найти субмаксимальную цифру, если она вообще есть! Возьмём к примеру, число 9(10). В восьмеричном представлении оно записывается как 11(8) - у ней только одна максимальная цифра, а второй нет. Так вот, максимальную цифру max печатаем сразу после первого итерационного цикла while. А вторую максимальную цифру submax печатаем после второго параметрического цикла for, если она вообще есть, и не печатаем, если её нет.
3. Побитовые операции используются такие: получение очередной цифры восьмеричного представления числа n - это n&7, а деление на 8 - это n>>=3.
P.S. Пара разных циклов здесь для разнообразия, а массив - для простоты. Если кто-то придумает лучше, проще и эффективнее - пусть напишет своё решение, если ума хватит!
。◕‿◕。

#include <iostream>
using namespace std;
int main() {
const auto n = 8U;
cout << "unsigned long: ";
unsigned long num;
cin >> num;
auto a = 0U, b = 0U;
do {
auto x = num % n;
if (x > a) {
b = a;
a = x;
} else if (x > b) {
b = x;
}
if ((a ^ b) == 0 && a == n - 1U) break;
} while (num /= n);
cout << "result: " << a << ' ' << b << '\n';
system("pause > nul");
}
using namespace std;
int main() {
const auto n = 8U;
cout << "unsigned long: ";
unsigned long num;
cin >> num;
auto a = 0U, b = 0U;
do {
auto x = num % n;
if (x > a) {
b = a;
a = x;
} else if (x > b) {
b = x;
}
if ((a ^ b) == 0 && a == n - 1U) break;
} while (num /= n);
cout << "result: " << a << ' ' << b << '\n';
system("pause > nul");
}
Похожие вопросы
- Окей, все по новой. Что же на самом деле означает операция разыменования? C++
- Какие из этих книг вы посоветуете прочесть в первую очередь чтобы повысить свои знания в C/C++?
- Задача по C++
- День добрый \[-_-]/ вопрос по вузовскому программированию на си(C)
- Программирование C++ ПРОШУ ПОМОЧЬ!
- Почему создатель Linux Линус Торвальдс называет C++ ужасным языком, а ядро ОС Linux пишется только на Си?
- Задача на C++ (Остатки).
- Сделать перестановку чисел с помощью функции в C++, но у меня получается чепуха
- Задача по c++ на векторы. Часть программы написана. Нужны правки.
- Проблема с указателем в C++
По-моему, Вы удручены. Ни с того, ни и сего Вы берёте на себя сверхзадачу. Ведь по условиям задачи не требуется сохранять все восьмеричные цифры числа, востребованы только две. К чему массив городить?