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

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

26.07.2013, 16:54. Показов 13165. Ответов 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
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 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 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 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
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 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
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 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
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 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
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 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
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru