Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
1 / 1 / 0
Регистрация: 13.02.2015
Сообщений: 30

Вывод определенной цифры в числовой последовательности

22.09.2016, 08:12. Показов 8495. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе утро форумчане, решал задачки для бегинеров на c++ и столкнулся с задачей, до которой никак не могу допереть.

Пользователь вводит натуральное k с клавиатуры, программа выводит k-ую цифру(именно цифру), из последовательности квадратов натуральных чисел вида 1491625.... Не могу допереть, прошу вашей помощи, если можно с комментариями.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.09.2016, 08:12
Ответы с готовыми решениями:

Вычислить сумму элементов числовой последовательности, в записи значения которых содержится две разные цифры
Вычислить сумму элементов числовой последовательности, в записи значения которых содержится две разные цифры. Входные данные: Во...

Вычислить среднее арифметическое значение элементов числовой последовательности, в записи значения которых содержится две различные цифры
ычислить среднее арифметическое значение элементов числовой последовательности, в записи значения которых содержится две различные цифры....

Вывод определенных чисел из числовой последовательности (!без массива!)
Пользователь вводит ряд чисел (их количество он определяет сам, их количество находится в пределах от 1 до 100 включительно и является...

36
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
22.09.2016, 15:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от SpBerkut Посмотреть сообщение
Перешаманил. Стало веселее.
Таблицы, так таблицы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <algorithm>
#include <string>
 
 
int main()
{
   std::size_t numbersSumCount[] = {0, 3, 15, 81, 353, 1438, 5536, 20677, 75373, 269980, 953750, 3332258, 11537522, 39647136, 135375244, 459716899, 1553752467, 5229624506, 17537524700, 58620800259};
   std::size_t seqStartNubmers[] = {1, 4, 10, 32, 100, 317, 1000, 3163, 10000, 31623, 100000, 316228, 1000000, 3162278, 10000000, 31622777, 100000000, 316227767, 1000000000, 3162277661, 4294967296};
 
   std::size_t x = 58620800269;
   std::size_t index = (std::upper_bound(numbersSumCount, numbersSumCount+20, x)-numbersSumCount);
   std::size_t prevSeqIndex = index - 1;
   std::size_t diffIndex = (x-numbersSumCount[prevSeqIndex])/index;
   std::size_t numIndex = (x-numbersSumCount[prevSeqIndex])%index;
   std::size_t num = seqStartNubmers[index-1] + diffIndex;
   std::cout <<  std::to_string(num*num)[numIndex] << std::endl;
   
}
2
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
22.09.2016, 15:15
Croessmah, вы так шутите? Стринги, предрассчитанные ограниченные массивы... Байт еще на прошлой странице вроде нормальный алгоритм написал.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
22.09.2016, 15:20
Цитата Сообщение от _Ivana Посмотреть сообщение
предрассчитанные ограниченные массивы
Ограниченные для 64-битных чисел. Здесь скорость vs универсальность.
Цитата Сообщение от _Ivana Посмотреть сообщение
Байт еще на прошлой странице вроде нормальный алгоритм написал.
Где? Какой? Сколько будет считать индекс 58620800269?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
22.09.2016, 15:20
Цитата Сообщение от Croessmah Посмотреть сообщение
Последний раз редактировалось Croessmah
Цитата Сообщение от Croessmah Посмотреть сообщение
Таблицы, так таблицы.

Теперь понятно
0
Объявлятель переменных
 Аватар для SpBerkut
1225 / 411 / 321
Регистрация: 24.09.2011
Сообщений: 1,279
22.09.2016, 15:43
Цитата Сообщение от _Ivana Посмотреть сообщение
Байт еще на прошлой странице вроде нормальный алгоритм написал.
Apostol584 тоже вполне работоспособный код выложил.
Croessmah, откуда переменная num в 16-й строке?
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
22.09.2016, 15:48
Цитата Сообщение от SpBerkut Посмотреть сообщение
Apostol584 тоже вполне работоспособный код выложил.
Он выложил хрень собачью полную. Потому что для ответа надо сначала нафигачить в памяти всю (всю, Карл!) строку, причем постоянно реаллоцируя и переписывая ее куски для конкатенации.
1
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
22.09.2016, 15:56
Цитата Сообщение от SpBerkut Посмотреть сообщение
Croessmah, откуда переменная num в 16-й строке?
Видимо, вылетела при редактировании поста.
C++
1
std::size_t num = seqStartNubmers[index-1] + diffIndex;
P.S. исправил пост.

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <algorithm>
#include <string>
 
 
char getSymbol(std::size_t x)
{
   static constexpr std::size_t numbersSumCount[] = {0, 3, 15, 81, 353, 1438, 5536, 20677, 75373, 269980, 953750, 3332258, 11537522, 39647136, 135375244, 459716899, 1553752467, 5229624506, 17537524700, 58620800259};
   static constexpr std::size_t seqStartNubmers[] = {1, 4, 10, 32, 100, 317, 1000, 3163, 10000, 31623, 100000, 316228, 1000000, 3162278, 10000000, 31622777, 100000000, 316227767, 1000000000, 3162277661, 4294967296};
 
   /*//first index is 1 
   if(x==0){
      throw std::invalid_argument("invalid index: 0");
   }
   --x;
   */
 
   std::size_t index = (std::upper_bound(numbersSumCount, numbersSumCount+20, x)-numbersSumCount);
   std::size_t prevSeqIndex = index - 1;
   std::size_t diffIndex = (x-numbersSumCount[prevSeqIndex])/index;
   std::size_t numIndex = (x-numbersSumCount[prevSeqIndex])%index;
   std::size_t num = seqStartNubmers[index-1] + diffIndex;
   return std::to_string(num*num)[numIndex];
}
 
 
 
int main()
{
 
   for(std::size_t i = 0; i<100; ++i){
      std::cout << getSymbol(i);
   }   
}
3
Объявлятель переменных
 Аватар для SpBerkut
1225 / 411 / 321
Регистрация: 24.09.2011
Сообщений: 1,279
22.09.2016, 16:02
Цитата Сообщение от _Ivana Посмотреть сообщение
Он выложил хрень собачью полную. Потому что для ответа надо сначала нафигачить в памяти всю (всю, Карл!) строку, причем постоянно реаллоцируя и переписывая ее куски для конкатенации.
Я в курсе. У Байта тоже не зарадуешься, т.к. вычислять квадрат несколько тысяч раз подряд — я извиняюсь.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
22.09.2016, 16:05
Я не вчитывался в алгоритм Байта, я просто
1) не увидел ни одной строки (стринга) в его коде
2) привык доверять его котам
Ежу же понятно, что отщипывать от искомого числа количества разрядов последовательных квадратов быстрее и экономнее по памяти, чем костылить через стринги.
1
Объявлятель переменных
 Аватар для SpBerkut
1225 / 411 / 321
Регистрация: 24.09.2011
Сообщений: 1,279
22.09.2016, 16:10
Croessmah, где-то баг. getSymbol(280) должен вернуть 6, а возвращает 1. Пруф: http://oeis.org/A001191/b001191.txt
P.s. Хотя, быть может, я не ту последовательность проверяю...
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
22.09.2016, 16:21
Цитата Сообщение от SpBerkut Посмотреть сообщение
У Байта тоже не зарадуешься,
Согласен.
Нужно использовать то, что числа от sqrt(102n) до sqrt(102n+1) дают n+1 знаков и от sqrt(102n+1) до sqrt(102n+2) n+2 знака. И сразу просчитывать вот такие экспотенциальные куски.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
22.09.2016, 16:25
Решение в лоб:
Цитата Сообщение от SpBerkut Посмотреть сообщение
getSymbol(280) должен вернуть 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
 
int main()
{
    std::string str;
    for(std::size_t i = 1; i<1000; ++i){
        str += std::to_string(i*i);
    }
    std::cout << str[280];
}
Вывод:
1
http://rextester.com/VKU34613

Видимо, Вы не учли, что в моей программе индексы берутся с нуля,
у ТС в задаче с 1, но этим заморачиваться я не желаю,
но всё же в функции getSymbol я сделал поправочку
C++
1
2
3
4
   if(x==0){
      throw std::invalid_argument("invalid index: 0");
   }
   --x;
которую закомментировал.
Уберите комменты и будет 6.

И да, на самых последних индексах провести тест не могу,
так что сделать ограничение индекса сверху тоже не получится.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
22.09.2016, 16:31
Цитата Сообщение от Байт Посмотреть сообщение
Нужно использовать то
что и сделал Croessmah. Ну, я бы значения в массивах высчитывал программно, но это уже дело вкуса...
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
22.09.2016, 16:32
Цитата Сообщение от Байт Посмотреть сообщение
Ну, я бы значения в массивах высчитывал программно
Так я и высчитывал программно. Или Вы думаете, что я с калькулятором сидел?
Но делать это каждый раз особого смысла нет.
Там еще был третий массив, но он в конечной реализации уже был не нужен.
0
Объявлятель переменных
 Аватар для SpBerkut
1225 / 411 / 321
Регистрация: 24.09.2011
Сообщений: 1,279
22.09.2016, 16:47
Цитата Сообщение от Croessmah Посмотреть сообщение
Видимо, Вы не учли, что в моей программе индексы берутся с нуля
Это да, не учёл. Заметил это только после того, как уже не мог исправить свой пост.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
22.09.2016, 17:15
SpBerkut, я вообще сначала другое решение планировал.
Сделал быстренько, обновил страничку, а Вы уже такое решение выдали.
Ну не выкладывать же тоже самое,
правда у меня массив поболее был, и я его потом выкинул.

Поэтому я решил сразу сделать таблички для кол-ва символов
до каждого прибавления символов. Это массив numbersSumCount.
Название взято от балды, как у настоящего говнокодера.

Оставлю здесь небольшое объяснение работы.
Последовательность 1491625364964811001211441691962252562893 24361400...
Массив numbersSumCount: 0, 3, 15, ...
numbersSumCount[x] = индекс с которого начинается последовательность (x+1)-значных чисел.
numbersSumCount[0] = 0: до (0+1) однозначных чисел не было ни одного символа.
numbersSumCount[1] = 3: до (1+1) двузначных чисел находится 3 символа (149).
numbersSumCount[2] = 15: до (2+1) трехзначных чисел находится 15 символов (149162536496481).
и т.д.

Второй массив (seqStartNubmers) это числа с которых квадраты начинают прибавлять в символах.
seqStartNubmers[0] = 1:переход квадрата с нуля символов в числе на 1 символ начинается с 1. (1*1=1)
seqStartNubmers[1] = 4: (4*4=16) - два символа
seqStartNubmers[2] = 10: (10*10=100) - три символа
seqStartNubmers[3] = 32: (32*32=1024) - четыре символа
и т.д.
Можно было хешировать сами квадраты,
но я что-то тупанул сначала, а потом лень было.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//ищем в какой из последовательностей лежит заданный индекс.
//и получаем индекс элемента, куда бы наш элемент мог быть вставлен.
//используем для этого бинарный поиск в упорядоченной последовательности.
//index будет одновременно и количеством цифр в числе.
std::size_t index = (std::upper_bound(numbersSumCount, numbersSumCount+20, x)-numbersSumCount);
//получаем предыдущий индекс (просто index-1 везде резало глаза)
std::size_t prevSeqIndex = index - 1;
//определяем, насколько чисел заданный индекс опережает 
//начало последовательности чисел с данным количеством чисел
std::size_t diffIndex = (x-numbersSumCount[prevSeqIndex])/index;
//Вычисляем какую цифру из конечного числа нужно брать
std::size_t numIndex = (x-numbersSumCount[prevSeqIndex])%index;
//Вычисляем число, в которое попал заданный индекс
std::size_t num = seqStartNubmers[index-1] + diffIndex;
//Переводим квадрат(вот если бы захешировал, не надо было бы умножать) 
//этого числа в строку, берем нужный индекс и возвращаем символ.
return std::to_string(num*num)[numIndex];


P.S. Да, объяснять это прям мое. Кто-нибудь что-нибудь понял из написанного?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
22.09.2016, 17:19
Croessmah, да все понятно Просто раз уж такая пьянка, то надо вылезать из детских штанишек 64 размера и переходить в безразмерные взрослые штаны (Ну, или сразу брать языки с такими штанами из коробки )
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.09.2016, 17:19

Вывод матрицы в Си в определенной последовательности
Привет ребята. Есть такая задача. Есть матрица 2x6 и мне нужно вывести ее на экран в форме которая на картинке (фото прилагаются,...

Вывод столбцов в определенной последовательности
Dim bdcon As ADODB.Connection Dim bdrec As ADODB.Recordset strbd = &quot;Provider=Microsoft.ACE.OLEDB.12.0;Data Source='&quot; &amp; putt &amp; &quot;';&quot; ...

Вывод информации из базы данных в определенной последовательности
Доброго времени суток. Я запутался и прошу помощи у вас. Если не сложно подскажите что мне делать. Создаю таблицу с расписанием. первый...

Вывести значения элементов числовой последовательности, в записи значения которых содержится две одинаковых цифры
Вывести значения элементов числовой последовательности, в записи значения которых содержится две одинаковых цифры. Входные данные: Во...

Вывод k-ой цифры из последовательности натуральных чисел.
Привет программисты. Помогите мне немного, не получается решить задачу: Не получается решить задачу: &quot;Составить программу для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru