Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Определить цифру на n - ой позиции послед - ти


Автор: ioManip 27.10.2012, 09:16
Задача
 Дано n - целое. Последовательность сост. из степеней 10 - ки (110100100010000....).
 Определить какая цифра находиться на n позиции последовательности.

Вообщем не прошу исходного кода(  на Ваше усмотрение  ), прошу помочь найти закономерность(алгоритм).

Из того, что я увидел:
1. Можно через строки, но ведь должен быть другой способ!?
2. Нашел зависимость, связанную с ариф. прогрессией, т.е. 1 - ы  стоят на 0,1,3,6 позициях, но не пойму как реализовать...

Автор: feodorv 27.10.2012, 09:56
Цитата(ioManip @  27.10.2012,  10:16 Найти цитируемый пост)
найти закономерность

Код

1 - 0нулей - 1 - 1ноль - 1 - 2нуля - 1 - 3 нуля - 1 - 4нуля...

Автор: Ln78 27.10.2012, 10:06
Цитата(ioManip @  27.10.2012,  09:16 Найти цитируемый пост)
стоят на 0,1,3,6 позициях

Сумма членов арифметической прогрессии, в данном случае: k*(k+1)/2.
Выяснить, представляется ли заданное n в таком виде. Возможны, например, такие варианты:
1. Просто в цикле увеличиваем переменную k, рассчитываем k*(k+1)/2 и сравниваем с n. Если равно - единица, если меньше - продолжаем цикл, если больше - заканчиваем цикл, считаем, что там нуль.
2. Цикл заменить расчётом квадратного корня из 2*n, взять целую часть от этого корня, т.е. k = int(sqrt(2.0*n)). Если k*(k+1) = 2*n - единица, иначе - нуль.

Автор: ioManip 27.10.2012, 10:46
feodorv, Спасибо!
Ln78, Спасибо smile . Скажите, а как Вы пришли в этой формуле? k*(k+1)/2.  smile 

Автор: Dem_max 27.10.2012, 10:59
Это тема должна находиться в разделе Алгоритмы.

Автор: Ln78 27.10.2012, 11:01
Цитата(ioManip @  27.10.2012,  10:46 Найти цитируемый пост)
Скажите, а как Вы пришли в этой формуле?

ioManip, лет 30 назад учился в школе. Там мне рассказали про эту форурмулу те, кто пришёл к ней ещё раньше.  smile 

Автор: feodorv 27.10.2012, 11:38
Цитата(ioManip @  27.10.2012,  11:46 Найти цитируемый пост)
Скажите, а как Вы пришли в этой формуле? k*(k+1)/2.

Как рассуждал Гаусс-школьник: напишем ряд чисел от 1 до N в строчку, а под ним ещё один - от N до 1, число под числом:
Код

1       2    3    ....       98    99   100
100   99   98                3      2     1

Нетрудно заметить, что сумма двух чисел в столбце - всегда N+1, столбцов - N, поэтому сумма чисел в двух рядах - N*(N+1), а в одном ряду  - N*(N+1)/2 (поскольку ряды совпадают, только записаны в противоположных порядках)...

Автор: ioManip 27.10.2012, 11:47
feodorv,  Спасибо!  smile   smile  smile

Добавлено через 12 минут и 33 секунды
Ребята smile Последний вопрос! 2 - ой алгоритм предложенный Ln78, почему именно корень из 2 * n?

Автор: feodorv 27.10.2012, 12:08
Цитата(ioManip @  27.10.2012,  12:47 Найти цитируемый пост)
почему именно корень из 2 * n? 

Цитата(Ln78 @  27.10.2012,  11:06 Найти цитируемый пост)
Если k*(k+1) = 2*n - единица, иначе - нуль. 

Поэтому k ~= sqrt(2*n) smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)