On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 05.06.18 17:51. Заголовок: -Перестановка смежных цифр числа без использования массива.


Основой для данной темы послужил вопрос
Swapping the alternate digits of the given number without use of arrays на Stackoverflow.

Интересно отметить, что данный вопрос, как следует из его описания на Stackoverflow, возник во время прохождения интервью.

С моей точки зрения это ничего хорошего не говорит о тех, кто проводил интервью. Точнее говоря, говорит о низкой квалификации тех, кто проводил интервью и о неуважении к собеседнику. Дело в том, что чтобы решить эту задачу, требуется полное сосредоточение на этой задаче, а голова программиста может быть в это время занята совершенно другим, то есть быть, к примеру, сосредоточена на другой задаче, которую он решал или решает до прохождения интервью А потому переключиться с одного на другое бывает очень сложно, когда человек чем-то сильно увлечен. И поэтому, если человек не в состоянии сходу переключиться на совершенно не интересную ему задачу, и, не понятно, откуда и почему взявшуюся, то это совершенно не умаляет квалификацию программиста.

И на собеседование надо приглашать тех кандидатов, о квалификации которых вы уже имеете представление, а не тратить впустую свое и чужое время. А чтобы иметь представление о квалификации кандидата, надо быть самому достаточно квалифицированным программистом. А квалифицированный программист - это публичный программист. Поэтому несложно оценить квалификацию такого программиста, при условии, что вы сами - публичный, то есть квалифицированный программист, и ваше имя достаточно часто встречается на специализированных форумах при обсуждении профессиональных вопросов.

Но вернемся к самой исходной задаче.

Можно просто решить эту задачу, например, если использовать рекурсивную функцию со статической локальной переменной.

Ниже показан пример такой рекурсивной функции и соответствующая демонстрационная программа, написанная на C++. Сама функция может быть использована и в программе на C при условии, если спецификатор типа auto в функции будет заменен на тип unsigned long long int..

 
#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;
}
}


Вывод программы на консоль будет следующим

 
1 - 1
12 - 21
123 - 213
1234 - 2143
12345 - 21435
123456 - 214365
1234567 - 2143657
12345678 - 21436587
123456789 - 214365879




Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 1 [только новые]





ссылка на сообщение  Отправлено: 06.06.18 16:44. Заголовок: Прямолинейный подход..


Прямолинейный подход для реализации не рекурсивной функции на C++, которую легко переписать на C, может выглядеть следующим образом, как показано ниже. Обратите внимание на то, что условие исходного задания на C, не использовать массивы, для C++ означает не использовать какие-либо контейнеры, как, например, std::string.

 
#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;
}
}


Вывод программы на консоль

 
1 - 1
12 - 21
123 - 213
1234 - 2143
12345 - 21435
123456 - 214365
1234567 - 2143657
12345678 - 21436587
123456789 - 214365879


Вы можете в этой теме размещать свои решения поставленной задачи. Как говорится, одна голова - хорошо, а две -лучше.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 11
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет