Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
2 / 2 / 0
Регистрация: 11.02.2017
Сообщений: 38

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

25.04.2017, 16:38. Показов 6702. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Найти k-ю цифру последовательности, сформированной из записанных ... подряд натуральных чисел: 123456789101112131415
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.04.2017, 16:38
Ответы с готовыми решениями:

Определить k-ю цифру последовательности, в которой выписаны подряд кубы натуральных чисел
Определить k-ю цифру последовательности 182764125216343 … ,в которой выписаны подряд кубы натуральных чисел .

Напечатать k-ю цифру последовательности 149162536, в которой выписаны подряд квадраты всех натуральных чисел
Напечатать k-ю цифру последовательности 149162536, в которой выписаны подряд квадраты всех натуральных чисел C++

В последовательности всех натуральных чисел от 1 до k найти k-ую цифру
Разработать программу, которая запрашивает с клавиатуры натуральное число k и определяет k-ую цифру последовательности...

7
1 / 1 / 2
Регистрация: 05.06.2015
Сообщений: 19
25.04.2017, 17:08
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
using namespace std;
 
int main()
{
    int i, a[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
    cout << "Введите id элемента"; cin >> i;
    cout<< a[i-1];
    system("Pause");
}
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
25.04.2017, 17:34
C++
1
char a[14] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '0', '1', '1', '1', '2'};
- такой массив по-моему нужен.
0
1 / 1 / 2
Регистрация: 05.06.2015
Сообщений: 19
25.04.2017, 17:39
Не столь важно, мой код как пример а массив он и сам объявит тот который ему нужен
Автору нужны целые числа(я так понял)а не строка символов
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
25.04.2017, 18:03
Kliker,
Нужно найти не число, а цифру. Причем цифру из последовательности натурального ряда.
DemolitionMan,
Особенно поможет массив, если нужно найти, например, 1256-ю цифру.
Вот для k<100:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main ()
{
    int k, digit;
    cin >> k;
    if (k<10) //если число <10
        digit = k;
    else
    {
        k-=9;
        int number = 9 + (k+1)/2; //число
        digit = (k%2)?number/10:number%10; //k-я цифра
    }
    cout << "Digit " << digit << endl;
    return 0;
}
Как сделать для больших значений, подумаю.

Добавлено через 20 минут
Как-то так (некошерно, ибо через строки, но другое не придумалось):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <sstream>
#include <string>
int main ()
{
    std::string s;
    int k, i = 1;
    std::cin >> k;
    std::ostringstream os;
    while (s.size()<k)
    {
        os << i++;
        s = os.str();
    }
    std::cout << "Digit "<< s[k-1];
    return 0;
}
1
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
25.04.2017, 18:52
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
 
 
int CountDigits(long long x)
{
    return (x < 10 ? 1 : 1 + CountDigits(x / 10));
}
 
 
long long Pow10(int x) { return x == 0 ? 1 : 10 * Pow10(x - 1); }
 
 
int GetIthDigit(long long x, int i)
{
    return x / Pow10(CountDigits(x) - i) % 10;
}
 
 
long long CountDigitsUpToX(long long x)
{
    if(x == 0)
    {
        return 0;
    }
 
    long long radix = 1, exponent = 1;
    long long count = 0;
    while(true)
    {
        long long temp = (exponent * 10 - exponent);
        if(x < temp)
        {
            break;
        }
        else
        {
            count += temp * radix;
            x -= temp;
            ++radix;
            exponent *= 10;
        }
    }
 
    if(x)
    {
        count += radix * x;
    }
    return count;
}
 
 
int GetDigit(long long p)
{
    long long l = 0, r = 1000000000000000ll;
    while(r - l > 1)
    {
        long long m = (l + r) >> 1;
        if(CountDigitsUpToX(m) >= p)
            r = m;
        else
            l = m;
    }
    long long x = l;
    if(CountDigitsUpToX(l) <= p)
    {
        x = r;
    }
 
    p -= CountDigitsUpToX(x - 1);
    return GetIthDigit(x, p);
}
 
 
int main()
{
    long long x;
    std::cin >> x;
    std::cout << x << "th digit is " << GetDigit(x) << std::endl;
    system("pause");
    return 0;
}
Можно сделать и без двоичного поиска, но так проще и работает быстро для чисел, влазящих в long long.

Что я делаю в алгоритме:
Пусть нам нужно найти цифру на p-той позиции.
CountDigitsUpToX(long long x) считает количество цифр в последовательности 123456789101112131415..., если в эту последовательность последним записали число x. Т.к. для любых a, b таких, что a < b выполняется CountDigitsUpToX(a) < CountDigitsUpToX(b), то функция CountDigitsUpToX - строго монотонная. Значит, на ней можно запилить бинарный поиск. При помощи этого самого поиска я нахожу такой минимальный k, что CountDigitsUpToX(k) >= p. Это значит, что число k вносит в нашу последовательность цифру на позиции p. Остается только сделать p1 = p - CountDigitsUpTo(k - 1), тем самым в p1 теперь хранится позиция в числе k, на которой находится искомая цифра. Находим эту цифру. Профит. Если кто-нибудь что-то поймет из такого непонятного объяснения, то он умён
1
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
25.04.2017, 19:28
Ещё вариант, найти сначала разрядность числа, в котором исходная цифра, потом само это число, а потом и саму цифру.
Двоичный поиск не нужен, ибо и так логарифмическая сложность.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
 
long long Pow10(int x) { return x == 0 ? 1 : 10 * Pow10(x - 1); }
 
long GetDigitCapacity(long& digitNumber)
{
    long sum = 0;
    long capacity = 0;
 
    while (true)
    {
        long addend = 9 * Pow10(capacity) * (capacity + 1);
        
        if (sum + addend > digitNumber)
        {
            digitNumber -= sum;
            return capacity + 1;
        }
        
        sum += addend;
        capacity++;
    }
}
 
long GetNumber(long capacity, long number)
{
    return Pow10(capacity - 1) + number;
}
 
int GetDigit(long source, long capacity, long digitNumber)
{
    digitNumber = capacity - digitNumber - 1;
    
    for (long i = 0; i < digitNumber; i++)
        source /= 10;
        
    return (int)(source % 10);
}
 
int GetDigitSmart(long digitNumber)
{
    digitNumber--;
    
    long capacity = GetDigitCapacity(digitNumber);
    long number = GetNumber(capacity, digitNumber / capacity);
    int digit = GetDigit(number, capacity, digitNumber % capacity);
    
    return digit;
}
 
int main()
{
    long long x;
    std::cin >> x;
    std::cout << x << "th digit is " << GetDigitSmart(x) << std::endl;
    system("pause");
    return 0;
}
Добавлено через 6 минут
Только long на long long надо заменить, забыл когда переносил с C#.
1
2 / 2 / 0
Регистрация: 11.02.2017
Сообщений: 38
25.04.2017, 20:25  [ТС]
Всем спасибо!

Добавлено через 18 минут
Dani, Мне понравился ваш код. Не могли бы вы подробнее закомментить строки, а то с вашей записи я не все понял (значит тупой )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.04.2017, 20:25
Помогаю со студенческими работами здесь

Найти n-ую цифру в последовательности, образованной записью квадратов натуральных чисел
На доске выписана последовательность квадратов целых чисел, без пробелов, начиная с единицы: 1 4 9 16 25 36 49 64 81 100… . Найдите n-ую...

Вывести K-тую цифру последовательности из цифр натуральных чисел
#include &lt;stdio.h&gt; #include &lt;iostream&gt; using namespace std; void main() { int k, i, n=0; cout &lt;&lt; &quot;Enter k = &quot;; cin...

Найти K-ю цифру в строке натуральных чисел
Сразу о главном: дано натуральное K. Найти K-ю цифру в строке натуральных чисел 123456789101112131415.... Что с этим счастьем делать, ума...

Дана последовательность факториалов натуральных чисел. Найти k-ю цифру
Здравствуйте. Задумался над условием задачи. Дана последовательность факториалов натуральных чисел. Составить программу на С, которая...

Найти k-ю цифру последовательности, сформированной из записанных подряд натуральных чисел
Привет всем, помогите сделать программы на паскале, а то я больше с С++ на &quot;ты&quot;. Задачи с олимпиады, нужно срочно. Спасибо зарание. А...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru