Форум » C/C++ для начинающих (C/C++ for beginners) » -Перестановка смежных цифр числа без использования массива. » Ответить

-Перестановка смежных цифр числа без использования массива.

Сыроежка: Основой для данной темы послужил вопрос Swapping the alternate digits of the given number without use of arrays на Stackoverflow. Интересно отметить, что данный вопрос, как следует из его описания на Stackoverflow, возник во время прохождения интервью. С моей точки зрения это ничего хорошего не говорит о тех, кто проводил интервью. Точнее говоря, говорит о низкой квалификации тех, кто проводил интервью и о неуважении к собеседнику. Дело в том, что чтобы решить эту задачу, требуется полное сосредоточение на этой задаче, а голова программиста может быть в это время занята совершенно другим, то есть быть, к примеру, сосредоточена на другой задаче, которую он решал или решает до прохождения интервью А потому переключиться с одного на другое бывает очень сложно, когда человек чем-то сильно увлечен. И поэтому, если человек не в состоянии сходу переключиться на совершенно не интересную ему задачу, и, не понятно, откуда и почему взявшуюся, то это совершенно не умаляет квалификацию программиста. И на собеседование надо приглашать тех кандидатов, о квалификации которых вы уже имеете представление, а не тратить впустую свое и чужое время. А чтобы иметь представление о квалификации кандидата, надо быть самому достаточно квалифицированным программистом. А квалифицированный программист - это публичный программист. Поэтому несложно оценить квалификацию такого программиста, при условии, что вы сами - публичный, то есть квалифицированный программист, и ваше имя достаточно часто встречается на специализированных форумах при обсуждении профессиональных вопросов. Но вернемся к самой исходной задаче. Можно просто решить эту задачу, например, если использовать рекурсивную функцию со статической локальной переменной. Ниже показан пример такой рекурсивной функции и соответствующая демонстрационная программа, написанная на C++. Сама функция может быть использована и в программе на C при условии, если спецификатор типа auto в функции будет заменен на тип unsigned long long int.. [pre2] #include <iostream> unsigned long long int swap_adjacent_digits( unsigned long long int n ) { const auto Base = 10ull; static bool even_digit; auto digit = n % Base; n /= Base; if ( n ) { n = swap_adjacent_digits( n ); even_digit = not even_digit; if ( even_digit ) { auto tmp = digit; digit = n % Base; n = n - digit + tmp; } } else { even_digit = false; } return Base * n + digit; } int main() { const auto Base = 10ull; for ( auto n = 0ull, i = 0ull; ++i < Base; ) { n += i; std::cout << n << " - " << swap_adjacent_digits( n ) << '\n'; n *= Base; } } [/pre2] Вывод программы на консоль будет следующим [pre2] 1 - 1 12 - 21 123 - 213 1234 - 2143 12345 - 21435 123456 - 214365 1234567 - 2143657 12345678 - 21436587 123456789 - 214365879 [/pre2]

Ответов - 1

Сыроежка: Прямолинейный подход для реализации не рекурсивной функции на C++, которую легко переписать на C, может выглядеть следующим образом, как показано ниже. Обратите внимание на то, что условие исходного задания на C, не использовать массивы, для C++ означает не использовать какие-либо контейнеры, как, например, std::string. [pre2] #include <iostream> #include <utility> unsigned long long int swap_adjacent_digits( unsigned long long int n ) { const auto Base = 10ull; size_t max_digits = 1; for ( auto tmp = n; tmp /= Base; ) ++max_digits; auto divisor = std::make_pair( 1ull, Base ); if ( max_digits % 2 ) { --max_digits; divisor.first *= Base; divisor.second *= Base; } for ( ; max_digits; max_digits -= 2 ) { auto lower = n / divisor.first % Base; auto upper = n / divisor.second % Base; n -= lower * divisor.first + upper * divisor.second; n += lower * divisor.second + upper * divisor.first; divisor.first = Base * divisor.second; divisor.second = Base * divisor.first; } return n; } int main() { const auto Base = 10ull; for ( auto n = 0ull, i = 0ull; ++i < Base; ) { n += i; std::cout << n << " - " << swap_adjacent_digits( n ) << '\n'; n *= Base; } } [/pre2] Вывод программы на консоль [pre2] 1 - 1 12 - 21 123 - 213 1234 - 2143 12345 - 21435 123456 - 214365 1234567 - 2143657 12345678 - 21436587 123456789 - 214365879[/pre2] Вы можете в этой теме размещать свои решения поставленной задачи. Как говорится, одна голова - хорошо, а две -лучше.



полная версия страницы