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

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

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

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

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

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

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

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

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

36
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
22.09.2016, 15:09 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
22.09.2016, 15:15 22
Croessmah, вы так шутите? Стринги, предрассчитанные ограниченные массивы... Байт еще на прошлой странице вроде нормальный алгоритм написал.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
22.09.2016, 15:20 23
Цитата Сообщение от _Ivana Посмотреть сообщение
предрассчитанные ограниченные массивы
Ограниченные для 64-битных чисел. Здесь скорость vs универсальность.
Цитата Сообщение от _Ivana Посмотреть сообщение
Байт еще на прошлой странице вроде нормальный алгоритм написал.
Где? Какой? Сколько будет считать индекс 58620800269?
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
22.09.2016, 15:20 24
Цитата Сообщение от Croessmah Посмотреть сообщение
Последний раз редактировалось Croessmah
Цитата Сообщение от Croessmah Посмотреть сообщение
Таблицы, так таблицы.

Теперь понятно
0
Объявлятель переменных
1220 / 406 / 320
Регистрация: 24.09.2011
Сообщений: 1,265
22.09.2016, 15:43 25
Цитата Сообщение от _Ivana Посмотреть сообщение
Байт еще на прошлой странице вроде нормальный алгоритм написал.
Apostol584 тоже вполне работоспособный код выложил.
Croessmah, откуда переменная num в 16-й строке?
1
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
22.09.2016, 15:48 26
Цитата Сообщение от SpBerkut Посмотреть сообщение
Apostol584 тоже вполне работоспособный код выложил.
Он выложил хрень собачью полную. Потому что для ответа надо сначала нафигачить в памяти всю (всю, Карл!) строку, причем постоянно реаллоцируя и переписывая ее куски для конкатенации.
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
22.09.2016, 15:56 27
Цитата Сообщение от 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
Объявлятель переменных
1220 / 406 / 320
Регистрация: 24.09.2011
Сообщений: 1,265
22.09.2016, 16:02 28
Цитата Сообщение от _Ivana Посмотреть сообщение
Он выложил хрень собачью полную. Потому что для ответа надо сначала нафигачить в памяти всю (всю, Карл!) строку, причем постоянно реаллоцируя и переписывая ее куски для конкатенации.
Я в курсе. У Байта тоже не зарадуешься, т.к. вычислять квадрат несколько тысяч раз подряд — я извиняюсь.
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
22.09.2016, 16:05 29
Я не вчитывался в алгоритм Байта, я просто
1) не увидел ни одной строки (стринга) в его коде
2) привык доверять его котам
Ежу же понятно, что отщипывать от искомого числа количества разрядов последовательных квадратов быстрее и экономнее по памяти, чем костылить через стринги.
1
Объявлятель переменных
1220 / 406 / 320
Регистрация: 24.09.2011
Сообщений: 1,265
22.09.2016, 16:10 30
Croessmah, где-то баг. getSymbol(280) должен вернуть 6, а возвращает 1. Пруф: http://oeis.org/A001191/b001191.txt
P.s. Хотя, быть может, я не ту последовательность проверяю...
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
22.09.2016, 16:21 31
Цитата Сообщение от SpBerkut Посмотреть сообщение
У Байта тоже не зарадуешься,
Согласен.
Нужно использовать то, что числа от sqrt(102n) до sqrt(102n+1) дают n+1 знаков и от sqrt(102n+1) до sqrt(102n+2) n+2 знака. И сразу просчитывать вот такие экспотенциальные куски.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
22.09.2016, 16:25 32
Решение в лоб:
Цитата Сообщение от 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
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
22.09.2016, 16:31 33
Цитата Сообщение от Байт Посмотреть сообщение
Нужно использовать то
что и сделал Croessmah. Ну, я бы значения в массивах высчитывал программно, но это уже дело вкуса...
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
22.09.2016, 16:32 34
Цитата Сообщение от Байт Посмотреть сообщение
Ну, я бы значения в массивах высчитывал программно
Так я и высчитывал программно. Или Вы думаете, что я с калькулятором сидел?
Но делать это каждый раз особого смысла нет.
Там еще был третий массив, но он в конечной реализации уже был не нужен.
0
Объявлятель переменных
1220 / 406 / 320
Регистрация: 24.09.2011
Сообщений: 1,265
22.09.2016, 16:47 35
Цитата Сообщение от Croessmah Посмотреть сообщение
Видимо, Вы не учли, что в моей программе индексы берутся с нуля
Это да, не учёл. Заметил это только после того, как уже не мог исправить свой пост.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
22.09.2016, 17:15 36
SpBerkut, я вообще сначала другое решение планировал.
Сделал быстренько, обновил страничку, а Вы уже такое решение выдали.
Ну не выкладывать же тоже самое,
правда у меня массив поболее был, и я его потом выкинул.

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

Оставлю здесь небольшое объяснение работы.
Последовательность 149162536496481100121144169196225256289324361400...
Массив 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
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
22.09.2016, 17:19 37
Croessmah, да все понятно Просто раз уж такая пьянка, то надо вылезать из детских штанишек 64 размера и переходить в безразмерные взрослые штаны (Ну, или сразу брать языки с такими штанами из коробки )
1
22.09.2016, 17:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2016, 17:19
Помогаю со студенческими работами здесь

Вывод столбцов в определенной последовательности
Dim bdcon As ADODB.Connection Dim bdrec As ADODB.Recordset strbd =...

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

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

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

Вывод числовой последовательности "лесенкой"
Задача: Осуществить вывод натуральных чисел от 1 до n следующим образом: 1 1 2 1 2 3 1 2 3 4...

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


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru