Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/56: Рейтинг темы: голосов - 56, средняя оценка - 4.63
10 / 10 / 1
Регистрация: 27.06.2013
Сообщений: 151

Задача "Натуральный ряд чисел"

26.07.2013, 16:54. Показов 13792. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
(Время: 1 сек. Память: 16 Мб)
Натуральные числа записаны в строку без каких-либо разделителей. Начало этой строки имеет вид 123456789101112131415161718192021… .

Требуется написать программу, которая определит первое вхождение десятичной записи заданного числа N в этой строке.

Входные данные

Входной файл INPUT.TXT содержит заданное число N (1 <= N <= 104).

Выходные данные

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

Предложите свои идеи по решению задачи.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.07.2013, 16:54
Ответы с готовыми решениями:

Натуральный ряд
Еще вопрос:&quot;Сколько чисел натурального ряда необходимо перемножить, чтобы их произведение превысило заданное натуральное число.&quot; ...

Построить односвязный список из входных последовательностей натуральный чисел
Построить односвязный список из входных послед-ей натуральный чисел удалить из списка узлы содержащие простые числа, есть у кого какие...

Натуральный ряд чисел
серия цифр Числа натурального ряда выписали подряд, так что образовалась последовательность: 123456789101112131415161718192021222324...

70
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
27.07.2013, 18:44
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Thinker Посмотреть сообщение
смысл начинать объяснять то, на что банально сил не хватает...
Там все то-же, что и для двухзначных, только условий в три раза больше будет. Если разобраться с подходом в двухзначным, то трехзначные не проблема.
Я лишь предложил идею, если ТС нужно, то он сам дальше разберется. Вся соль там в записи одного уравнения и одного неравенства, а дальше просто разбор случаев.
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.07.2013, 18:48
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Там все то-же, что и для двухзначных, только условий в три раза больше будет.
сложного в этой задаче ничего нет. надо только рассмотреть 9 граничных случаев для 1,2,3-значных чисел, ну а потом проверки в отдельных группах чисел. просто условия надо писать аккуратно и аккуратно вычислять позицию числа. так как это делать никому не хочется (скукатище), поэтому легче рассмотреть вариант от Dani
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2013, 20:14
Цитата Сообщение от Olivеr Посмотреть сообщение
так вот в чем дело...
Цитата Сообщение от Thinker Посмотреть сообщение
надо только рассмотреть 9 граничных случаев для 1,2,3-значных чисел
Может быть, например, ещё такое: 123. Выдаст 259, правильный ответ: 1.
0
1 / 0 / 1
Регистрация: 17.04.2013
Сообщений: 11
28.07.2013, 00:58
Kuzia domovenok, сначала не понял, переделал
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
#include <fstream>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
 
using namespace std;
 
//перевод числа в строку
class format
{
    static std::ostringstream oss;
public:
    template <class T>
    static std::string to_string(const T &numeric_value)
    {
        format::oss.str("");
        format::oss.clear();
        format::oss << numeric_value;
        return oss.str();
    }
};
 
ostringstream format::oss;
 
int main()
{
    string str;
    unsigned N; //заданное число
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    fin >> N;
    for (int i = 1; i <= N; i++)
        str += format::to_string(i);
 
    cout << str;
    fout << str.find(format::to_string(N)) + 1; //позиция, начиная с которой в строке записано первое вхождение заданного числа.
                                                //Нумерация позиций начинается с единицы.
 
}
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.07.2013, 01:14
fan_stud, если так упростить, то нормально будет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    string str;
    unsigned N = 123; //заданное число
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    //fin >> N;
    for (int i = 1; i <= N; i++)
        str += format::to_string(i);
 
    cout << str;
    cout << str.find(format::to_string(N)) + 1; //позиция, начиная с которой в строке записано первое вхождение заданного числа.
                                                //Нумерация позиций начинается с единицы.
    cout << endl;
    system("pause");
    return 0;
}
Вот это и есть позиция?
Миниатюры
Задача "Натуральный ряд чисел"  
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.07.2013, 01:21
Прошу прощения, одну вещь не сделал в коде, поэтому не понял вывод.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    string str;
    unsigned N = 123; //заданное число
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    //fin >> N;
    for (int i = 1; i <= N; i++)
        str += format::to_string(i);
 
    cout << str << endl;
    cout << str.find(format::to_string(N)) + 1; //позиция, начиная с которой в строке записано первое вхождение заданного числа.
                                                //Нумерация позиций начинается с единицы.
    cout << endl;
    system("pause");
    return 0;
}
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
28.07.2013, 11:20
Судя по "высокой практической ценности", это типичная олимпиадная задача. Захотелось попробовать решить ее без привлечения строк. И вот что получилось (число вводится с клавиатуры; для сути алгоритма это совершенно неважно). Не уверен, что уложится в 1 сек, но вот по памяти уложится с гарантией.

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
#include <iostream.h>
int SCurr=1,Pos=1;
int Arr[10],Ptr=0;
int NextDigit()
{
    int i,r,c;
    Pos++;
    if (Ptr == 0)
    {
        c=SCurr++;
        for (i=1; i<=10; i++) Arr[i]=0;
        for (i=1; i<=10; i++)
        {
            r=c % 10;
            Arr[Ptr++]=r;
            c=c / 10;
            if (c == 0) break;
        }
    }
    return Arr[--Ptr];
}
int main(int argc, char* argv[])
{
    int i,p,N,c,r,d,q;
    int digs[4];
    cout << "Enter number: ";
    cin >> N;
    c=N;
    p=0;
    for (i=1; i<=4; i++)
    {
        if (c==0) break;
        r=c % 10;
        digs[p++]=r;
        c=c / 10;
    }
    q=1;
    for (i=1; i < 2147483648; i++)
    {
        d=NextDigit();
        while(1)
        {
            if (d == digs[p-q])
            {       
                q++;
                if (q > p) break;
                d=NextDigit();
            }
            else
            {
                q=1;
                break;
            }
        }
        if (q > 1)
        {
            cout << Pos-q+1 << endl;
            break;
        }
    }
    return 0;
}
1
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
28.07.2013, 11:44
Catstail, Epic fail - не работает!
проверка 1121 - вывод 226
ожидание 13е место
т.к. ряд 12345678910111213

Добавлено через 2 минуты
Цитата Сообщение от Catstail Посмотреть сообщение
Судя по "высокой практической ценности", это типичная олимпиадная задач
что не так с практической ценностью?
а) это раздел для начинающих и ты не найдёшь тут каких-то практических задач
б) что ты вообще понимаешь под "практической"?
1
1 / 0 / 1
Регистрация: 17.04.2013
Сообщений: 11
28.07.2013, 14:19
alsav22, можно, я просто по условию делал
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
28.07.2013, 14:26
Catstail, даже если решать задачу влоб, то памяти хватит более чем на 5000 полностью сгенерированных последовательностей... Так что за памятью тут дело не стоит, зачем так много выделили на задачу?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
28.07.2013, 14:39
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Epic fail - не работает!
- я исправлю... Торопился.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
что ты вообще понимаешь под "практической"?
- применительно к данному разделу, это алгоритм (или структура данных), которая используется в расхожих повседневных задачах (списки, стеки, очереди, сортировки, поиск, и т.п.)
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
28.07.2013, 15:50
и еще один вариант
генерирует строку пока не найдет заданное число
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
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cmath>
 
int match(int x)
{
    std::string buf;
    std::string x_str = std::to_string(x);
    int digits = std::log10(x) + 1;
    int number_match = 0;
 
    if (x < 1 || x >= 10000) {
        return 38885;
    }
 
    for (int i = 1; i <= x; ++i) {
        for (int j = 0; j != digits; ++j) {
            buf.append( std::to_string(i++) );
        }
        --i;
        number_match = buf.find(x_str, number_match);
        if (number_match == std::string::npos) {
            number_match = buf.size() - digits;
        } else {
            return number_match + 1;
        }
    }
    return 1;
}
 
int main()
{
    std::ifstream in("input.txt");
    std::ofstream out("output.txt");
    if (!in.good() || !out.good())
        return 1;
    int x; in >> x;
    out << match(x);
    out.close();
    return 0;
}
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
28.07.2013, 16:53
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
 
    int x;
    scanf("%d", &x);
 
    char str[40000] = {'\0'};
    char buf[26] = {'\0'};
    char number[6] = {'\0'};
    char numbuf[6] = {'\0'};
 
    itoa(x, number, 10);
 
    int digits = strlen(number);
    int i, j, continue_from = 0;
 
    for (i = 1; i <= x; ++i) {
        buf[0] = '\0';
        for(j = 0; j < digits; ++j, ++i) {
            strcat( buf, itoa(i, numbuf, 10) );
        }
        strcat( str, buf );
        --i;
        char *match = strstr(str + continue_from, number);
        if (match == NULL) {
            continue_from = strlen(str) - digits;
        } else {
            printf("%d", match - str + 1);
            return 0;
        }
    }
    return 0;
}
Миниатюры
Задача "Натуральный ряд чисел"  
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
28.07.2013, 17:11
Вот решение без строк, без доп. функций и т.п. - "ручками":

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
#include <iostream.h>
 
int SCurr=1,Pos=1;
int Arr[10],Ptr=0;
int Counter=0;
 
int NextDigit()
{
    int i,r,c;
    Pos++;
    Counter++;
    if (Ptr == 0)
    {
        c=SCurr++;
        for (i=1; i<=10; i++) Arr[i]=0;
        for (i=1; i<=10; i++)
        {
            r=c % 10;
            Arr[Ptr++]=r;
            c=c / 10;
            if (c == 0) break;
        }
    }
    return Arr[--Ptr];
}
 
int main(int argc, char* argv[])
{
 
    int i,j,p,N,c,r,q;
    int digs[4],cadr[4];
        
    cout << "Enter number: ";
    cin >> N;
 
    c=N;
    p=0;
 
    for (i=1; i<=4; i++)
    {
        if (c==0) break;
        r=c % 10;
        digs[p++]=r;
        c=c / 10;
    }
 
    for (i=0; i<p; i++)
        cadr[i]=NextDigit();
 
    while (Counter <= 2147483647)
    {
        q=0;
        for (j=0; j<p; j++)
            if (digs[p-j-1] != cadr[j])
            {
                q=-1;
                break;
            }
        if (q == 0)
        {
            cout << "Pos=" << (Pos-p) << endl;
            break;
        }
        else
        {
            for (j=0; j<p-1; j++) cadr[j]=cadr[j+1];
            cadr[p-1]=NextDigit();
        }
    }
    return 0;
}
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
28.07.2013, 17:17
Catstail, 19-й тест не проходит(
Миниатюры
Задача "Натуральный ряд чисел"  
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
28.07.2013, 17:20
Да я не собирался тестировать на сайте... Мне было интересно решить задачу без строк и без библиотек. А что там в "19-м" тесте? Какое-то число не находит?
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
28.07.2013, 17:22
Catstail, выдает неверный ответ. Входные данные известны только для первых трёх тестов...
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
28.07.2013, 17:23
Olivеr, можешь привести эти три теста?
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
28.07.2013, 17:27
Catstail,
№INPUT.TXTOUTPUT.TXT
1454
210110
314273
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
28.07.2013, 17:29
Спасибо, все проходит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.07.2013, 17:29

Отразить основание, название, алфавит и натуральный ряд чисел (20 чисел) системы счисления
Составить таблицу, в которой отразить: основание, название, алфавит и натуральный ряд чисел (20 чисел) системы счисления если а) n=9;...

Натуральный ряд.
Составить программу вычисления суммы чисел натурального ряда. Натуральный ряд содержит k чисел. Полученную сумму умножить на 3, используя...

Обобщенный натуральный ряд
Нет, я не ошибся, господа. Не гармонический, а именно натуральный. Возникла мысль найти сумму n членов натурального ряда в заданной...

Проверить полноту метрического пространства N (натуральный ряд)
Здравствуйте, помогите: проверить полноту метрического пространства N (натуральный ряд)

Задача на ряд чисел
Допустим, у вас есть случайный числовой ряд. Если для каждого числа Ai в этом ряду посчитать количество других чисел из ряда, меньших Ai...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru