Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
dyap
2 / 2 / 0
Регистрация: 20.09.2010
Сообщений: 58
#1

Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. - C++

20.09.2010, 19:21. Просмотров 1897. Ответов 14
Метки нет (Все метки)

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

Я тут наверно уже поднадоел, но сам такую программу написать не смогу. Натолкните хотя бы на мысль, как такое сделать, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2010, 19:21     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел.
Посмотрите здесь:

Найти суммы каждой пары подряд идущих чисел C++
C++ Составить программу для нахождения наименьшего общего кратного трех натуральных чисел
C++ Составить программу для нахождения наименьшего общего кратного трех натуральных чисел
Написать функцию для нахождения самой длинной последовательности подряд идущих элементов массива,равных какому-либо заданному C++
Определить максимальное количество идущих подряд чётных чисел C++
Найти максимальное количество простых чисел, идущих подряд C++
C++ Найти в последовательности чисел два подряд идущих нуля
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
20.09.2010, 19:23     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #2
Попробуйте через масив.
dyap
2 / 2 / 0
Регистрация: 20.09.2010
Сообщений: 58
20.09.2010, 19:26  [ТС]     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #3
За совет спасибо, но может быть это можно как-то проделать без использования массива? Мы их еще не проходили, так что я думаю задача предусматривает решение проще...
asics
Freelance
Эксперт C++
 Аватар для asics
2842 / 1779 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
20.09.2010, 19:31     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #4
Ну так если они подряд идущи,начиная с 1,значит 1-я цыфра будет = 1; 2-я = 2; и т.д
dyap
2 / 2 / 0
Регистрация: 20.09.2010
Сообщений: 58
20.09.2010, 20:02  [ТС]     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #5
Но вся сложность начинается после 9! Ведь дальше идет 10, а не 1! Потом 11,12 и т.д. Тоесть 20 цифра будет 1...Вот.
rangerx
1921 / 1530 / 139
Регистрация: 31.05.2009
Сообщений: 2,892
20.09.2010, 20:32     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #6
Цитата Сообщение от dyap Посмотреть сообщение
Мы их еще не проходили, так что я думаю задача предусматривает решение проще...
C
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main()
{
    char x[] = "123456789101112131415";
    printf("%c", x[19]); // 20-я позиция
    return 0;
}
куда уж проще?
KuKu
 Аватар для KuKu
1552 / 1030 / 73
Регистрация: 17.04.2009
Сообщений: 2,968
20.09.2010, 20:35     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #7
ну надо бы получше не вручную их вводить числа, а вводить их количество ...
1) ввести количиство
2) запихать в цикле в чаровский массив
3) и смотреть по индексу

это в лоб, думаю можно еще посмотреть через остатки от деления, но чет лениво
asics
20.09.2010, 20:36
  #8

Не по теме:

Цитата Сообщение от KuKu Посмотреть сообщение
но чет лениво
ет точно

Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
20.09.2010, 20:39     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
string itoa(int n)
{
    char buf[20];
    sprintf(buf,"%d",n);
    return buf;
}
 
int main()
{
    int n;
    cin >> n;
    string s;
    for(int i = 1; s.size() <= n; i++)
        s += itoa(i);
    cout << s[n] << endl;
    system("pause");
}
Индексация с нуля.
dyap
2 / 2 / 0
Регистрация: 20.09.2010
Сообщений: 58
20.09.2010, 20:48  [ТС]     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #10
rangerx,
Честно говоря, у меня этот код не работает. Консоль открывается и закоывается. И все...


Цитата Сообщение от KuKu Посмотреть сообщение
думаю можно еще посмотреть через остатки от деления, но чет лениво
Через остатки долго код писать? Может хотя бы принцип напишите? Я попробую сам написать код..

Добавлено через 5 минут
Хохол,
Спасибо! Программа отлично работает! Только я не совсем понял строчки 5-9 и 16-20. Не могли бы Вы пояснить?
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
20.09.2010, 21:01     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #11
Цитата Сообщение от dyap Посмотреть сообщение
rangerx,
Честно говоря, у меня этот код не работает. Консоль открывается и закоывается. И все..
getch();
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
20.09.2010, 22:26     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #12
Читайте про функции, класс string и потоки ввода/вывода(istream/ostream).
kidiam
21 / 21 / 2
Регистрация: 12.07.2010
Сообщений: 42
20.09.2010, 23:07     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #13
Пример работы
537000000

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Process returned 3 (0x3) execution time : 71.171 s
Press any key to continue.
Почему так долго? Где результат?
Или программа работает не для всех чисел? Если так, то уточните до какого.

Правильнее будет так. Индекс от нуля в строке "012345678910111213..."
Работает от 0 до 4294967295. Можно ещё большие числа если сделать все типы "unsigned long long", но тогда будет не до 2^64-1, а до ~ (2^64-1)/10.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <math.h>
 
int main()
{
    unsigned int i, k, d;
    unsigned long long n0, n, p;
    scanf("%d", &k);
    for (n0=i=1, n=p=9; (unsigned long long)k>n; i++, p*=10, n0=n, n+=i*p);
    d = (p/9*10 - ((n - k)/i) - 1)/(unsigned long long )pow(10, (n - k)%i) % 10;
    printf("%d", d);
    return 0;
}
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
20.09.2010, 23:24     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #14
Моя программа не претендует на идеальность, а лишь показывает идею, которую может использовать топикстартер. А может не использовать.

Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от kidiam Посмотреть сообщение
C++
1
2
3
for (n0=i=1, n=p=9; (unsigned long long)k>n; i++, p*=10, n0=n, n+=i*p);
 d = (p/9*10 - ((n - k)/i) - 1)/(unsigned long long )pow(10, (n - k)%i) % 10;
 printf("%d", d);
Почему так запутано? Где здравый смысл?



Добавлено через 5 минут
C++
1
(unsigned long long )pow(10, (n - k)%i)
Довольно опасная конструкция, в результате вычисления pow может вместо красивого круглого числа получиться что-нибудь типа 99999.99999 и после обрезания до целого все будет плохо. Для подстраховки советую округлить:
C++
1
(unsigned long long )(0.5+pow(10, (n - k)%i))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2010, 23:46     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел.
Еще ссылки по теме:

Для каждых k подряд идущих чисел найти минимум C++
C++ Вывести в другой массив последовательности идущих подряд простых чисел
Подсчитать наибольшее количество одинаковых подряд идущих чисел последовательности C++
C++ С паскаля в с++, последовательности идущих подряд простых чисел
C++ Дан текст, содержащий цифры. Найти наибольшее количество идущих подряд цифр

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

Или воспользуйтесь поиском по форуму:
kidiam
21 / 21 / 2
Регистрация: 12.07.2010
Сообщений: 42
20.09.2010, 23:46     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел. #15
Смысл таков
1 найти n - правую позицию границы группы i-разрядных цифр (например для "123...789" n=9, для "101112..979899" n=189 или "100101...997998998999" n=2889)
2 выделить сначала порядковое число в которое попала наша цифра (p/9*10 - ((n - k)/i) - 1). Затем найти его позицию в знаменателе 10^((n - k)%i) и найти остаток.

Операция pow действительно ошибочна ещё правильнее будет так (лень было цикл делать для пары итераций):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <math.h>
 
int main()
{
    unsigned int i, j, d, k;
    unsigned long long n, p;
    scanf("%d", &k);
    for (i=1, n=p=9; (unsigned long long)k>n; i++, p*=10, n+=i*p);
    p = (p/9*10-((n - k)/i) - 1);
    for (d=0; d<((n - k)%i); d++) p/=10;
    printf("%d", (int)p%10 );
    return 0;
}
Yandex
Объявления
20.09.2010, 23:46     Программа для нахождения к-ой цифры в ряду подряд идущих натуральных чисел.
Ответ Создать тему
Опции темы

Текущее время: 00:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru