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

Найти все натуральные числа <= n, десятичная запись которых - строго упорядоченная последовательность

16.10.2014, 17:54. Показов 5876. Ответов 23
Метки нет (Все метки)

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

Циклы.Найти все натуральные числа не превосходящие заданного n, десятичная запись которых есть строго убывающая последовательность цифр
Может кто поможет новечку с заданием?%-)))заранее благодарю)С меня рек само собой))) Найти все натуральные числа не превосходящие...

Найти все натуральные числа, не превосходящие заданного и десятичная запись которых последовательность
Помогите, пожалуйста, составить программу на С++: Найти все натуральные числа , не превосходящие заданного N, десятичная запись которых...

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

23
 Аватар для D_in_practice
343 / 343 / 331
Регистрация: 02.10.2014
Сообщений: 666
18.10.2014, 13: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
#include <iostream>
#include <iomanip>
#include <cmath>
 
using namespace std;
 
int main(){
    
    int in; 
    do{
        cout << "Ââåäèòå in = ";
        cin >> in;
    }while(in <= 0);
 
    int out;
    for (int i = 1; i < 9; ++i){
                
        int j = i + 1;
        int out = i * 10 + j;
        while(out <= in){
            if (j <= 9)
                cout << setw(log10(in) + 2) << out;
            ++j;
            out = out * 10 + j;         
        }       
    }
    
    for (int i = 9; i > 0; --i){
                
        int j = i - 1;
        int out = i * 10 + j;
        while(out <= in){
            if (j >= 0)
                cout << setw(6) << out;
            --j;
            out = out * 10 + j;         
        }       
    }           
                     
    return 0;
}
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
18.10.2014, 21:18
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
/////////////////////////////////////////////////////////////////////////////////////////
//Найти все натуральные числа, не превосходящие заданного числа N, десятичная запись которых 
//есть строго возрастающая или строго убывающая последовательность цифр.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
void    print_increasing_and_decreasing_digits_sequences_for( int  n )
{
    bool    num_is_good     =   false;
 
    for( long long  i = 1; i <= n; ++i )
    {
        T_str   num_str     =   std::to_string(i);
 
        if  (
                num_str.size()  ==  1
            )
        {
            num_is_good     =   true;
        }
        else
        {
            int     diff    =   num_str[0]  -   num_str[1];
            num_is_good     =   diff    !=  0;
 
            if( num_is_good )
            {
                num_is_good     =       std::adjacent_find
                                            (
                                                num_str.begin   (),
                                                num_str.end     (),
 
                                                [=] (
                                                        char    L,
                                                        char    R
                                                    )
                                                {
                                                    return  ( L - R ) * diff    <=  0;
                                                }
                                            )
 
                                    ==  num_str.end();
            }//if
        }//else
 
        if( num_is_good )
        {
            std::cout   <<  i
                        <<  '\t';
        }//if
    }//for
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    for(;;)
    {
        std::cout   <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  "n = ";
 
        int     n   =   0;
        std::cin    >>  n;
        print_increasing_and_decreasing_digits_sequences_for( n );
    };//for
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12941 / 6808 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
18.10.2014, 21:48
Цитата Сообщение от D_in_practice Посмотреть сообщение
...
Ввел 100. В выводе не увидел числа 24. 24 уже не строго возрастающая последовательность цифр?

Добавлено через 19 минут
В предположении, что однозначные числа тоже удовлетоворяют требованиям

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
int main(){
 
  unsigned n = 1000;
 
  for (unsigned start = 1; start < 10; ++start)
  {
    std::cout << start << " ";
 
    for (unsigned step = 1; step < 10 - start; ++step)
    {
      unsigned value_f = start;
      unsigned value_b = start;
 
      for (unsigned digit = start + step, mul = 10; digit < 10; digit += step, mul *= 10)
      {
        value_f = value_f * 10 + digit;
        if (value_f <= n)
          std::cout << value_f << " ";
 
        value_b = digit * mul + value_b;
        if (value_b <= n)
          std::cout << value_b << " ";
      }
    }
  }
                    
  std::cout << std::endl;
}
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
18.10.2014, 22:24
TheCalligrapher, неверно.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12941 / 6808 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
19.10.2014, 02:55
Цитата Сообщение от Mr.X Посмотреть сообщение
TheCalligrapher, неверно.
(Блин, все время не та кнопка нажимается.)

Ваш ответ бессмысленен. Ответ "неверно" будет приниматься только с указанием, что именно неверно. А именно, если решение неверно, то придется привести контрпример. Итак?

Добавлено через 11 минут
Хотя да, беру свои слова обратно. Действительно, решение неверное. Я почему-то завязался на фиксированный шаг в каждом числе... Пошел, так сказать, на поводу. Безобразие.

Добавлено через 1 час 19 минут
Осмелюсь совершить еще одну попытку. Теперь - по настоящему хакерскую, в надежде быть отправленным на сельхозработы прямо с пары. Опять же, код написан в рамках предположения, что однозначные последовательности - допускаются. Я также не стал вычищать из ответа последовательность '0' - пусть это будет нашей затравкой для холивора на тему того, является ли ноль натуральным числом.

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
#include <iostream>
#include <algorithm>
#include <cmath>
 
unsigned next_pattern(unsigned pattern)
{
  unsigned int t = (pattern | (pattern - 1)) + 1;
  return t | ((((t & -t) / (pattern & -pattern)) >> 1) - 1);
}
 
const unsigned ASCENDING[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
const unsigned DESCENDING[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
 
void print_number(unsigned pattern, const unsigned table[], unsigned n)
{
  unsigned value = 0;
 
  for (unsigned i = 0; pattern != 0; pattern >>= 1, ++i)
    if ((pattern & 1) != 0)
    {
      value = value * 10 + table[i];
      if (value > n)
        break;
    }
 
  if (value <= n)
    std::cout << value << " ";
}
 
int main() 
{
  unsigned n = 1000;
 
  unsigned full_length = (unsigned) (std::log10(n) + .5) + 1;
 
  unsigned length = std::min(full_length, 9u);
  for (unsigned digits = 1; digits <= length; ++digits)
  {
    unsigned pattern = (1 << digits) - 1;
    do
      print_number(pattern, ASCENDING, n);
    while ((pattern = next_pattern(pattern)) <= 0x1FF);
  }
 
  length = std::min(full_length, 10u);
  for (unsigned digits = 1; digits <= length; ++digits)
  {
    unsigned pattern = (1 << digits) - 1;
    do
      print_number(pattern, DESCENDING, n);
    while ((pattern = next_pattern(pattern)) <= 0x3FF);
  }
 
  return 0;
}
Добавлено через 2 часа 46 минут
Функция 'next_pattern' подсмотрена здесь http://graphics.stanford.edu/~... ermutation ("Compute the lexicographically next bit permutation")
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.10.2014, 05:29
Присоединюсь к всеобщему веселью кода Каждый конечно свое болото будет хвалить, но мне мой вариант наиболее симпатичен (это не вдаваясь в подробности отправки на сельхозработы за логарифмы и проверки каждого бедного ++i)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
unsigned int n;
int d;
 
void find(unsigned int k, unsigned int r)
{
    if (r<n) {if (r>9) cout << r << '\n';} else return;
    for (int i=k+d; d>0 ? i<=9 : i>=0; i+=d) find(i, r*10+i);
}
int _tmain(int argc, _TCHAR* argv[]) 
{
    cout << "Enter integer n, not so big :) :"; cin >> n;
    cout << "ascending: \n"; d = 1; find(0, 0);
    cout << "descending: \n"; d = -1; find(10, 0);
    system("pause");
    return 0;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12941 / 6808 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
19.10.2014, 10:01
Ну за явный логарифм мне действительно стыдно - "скрипя сердцем" вписывал. Хотел было спрятать, но потом решил не морочиться. Но зато в "проверках каждого бедного ++i" меня никто упрекнуть не сможет!!!

Осмелюсь утверждать, что образовательная ценность моего варианта выше Можно часами прыгать по ссылкам в Инете, читая про Combinatorial number systems и т. п. Статья в Википедии по ссылке содержит вариацию использованной мной функции, называя ее "Gosper's hack" и отсылая читателя к четвертому тому Кнута.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38178 / 21113 / 4307
Регистрация: 12.02.2012
Сообщений: 34,716
Записей в блоге: 14
19.10.2014, 10:18
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
#include <stdio.h>
 
using namespace std;
 
int isGood(int n)
{
    int p,c,f;
    if (n < 10) return 1;
    p=n%10;
    n=n/10;
    f=0;
    while (n)
    {
       c=n%10;
       if (c==p) return 0;
       if ((c>p) && (f==-1))  return 0;
       if (c>p) f=1;
       if ((c<p) && (f==1))  return 0;
       if (c<p) f=-1;
       p=c;
       n=n/10;
    }
    return 1;
}      
 
int main(int argc, char *argv[])
{
    int i,N;
    printf("N=");
    scanf("%d",&N);
    for (i=1; i<=N; i++)
      if (isGood(i)) printf("%d ",i);
    printf("\n");
    system("PAUSE");
    return EXIT_SUCCESS;
}
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.10.2014, 15:10
TheCalligrapher, не проверял и не разбирал ваш последний вариант, но готов согласиться с его образовательной ценностью, даже если в конкретной реализации есть ошибки - узнавать новое всегда интересно.
А в плане оптимальности и практической применимости я бы предложил господам D_in_practice, Mr.X, Catstail и TheCalligrapher посоревноваться со мной временем выполнения алгоритмов и требуемой памятью на очень больших числах - только чур не дорабатывать алгоритмы, а запускать их прямо в том ужасно неоптимальном виде, в каком они представлены в этой теме, только печать результатов убрать, т.к. она много времени ест.
ЗЫ да, я знаю, что после определенного числа N выходные данные не будут меняться - хотя большинство, если не все из представленных алгоритмов будет честно мучиться дальше, выгребая и проверяя 11-ти, 12-ти и т.д. значные числа , но можем посоревноваться как до этого магического числа, так и после
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.10.2014, 15:10
TheCalligrapher, что-то вы перестали тестировать. По-моему у _Ivana не все числа выводит.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.10.2014, 15:14
Mr.X, покажите конкретный пример пропуска чисел. Разумеется я не вывожу однозначные числа (ака цифры), но во-первых, это добавить тривиально, а во-вторых, у меня ни одно число не дублируется, а однозначные надо запрещать или в возрастающей ветке или в убывающей, иначе они выведутся и там и там, и будут дубли, что имхо очень нехорошо.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.10.2014, 15:17
Цитата Сообщение от _Ivana Посмотреть сообщение
покажите конкретный пример
Для тысячи сколько чисел у вас выводит?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.10.2014, 15:22
Mr.X, вроде 285, если не ошибся с подсчетом строк в виндовом блокноте. Разумеется, без однозначных цифр.
Вы лучше не строки считайте, а ткните носом (если есть куда) гкакое конкретно число я пропускаю.
ЗЫ и да, я сам число n не вывожу - у меня проверка на строго меньше, но это опять же тривиальщина и для 1000 не будет отличий.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.10.2014, 15:31
_Ivana, пардон, вроде сходится, это я обсчитался.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.10.2014, 15:37
Предложение турнира в силе - пойдем всеми на ideone, он вроде время худо-бедно замеряет, и сравним наши убеждения Чтобы избавиться от долгого промежуточного вывода, для чистоты эксперимента можем просто считать количество таких чисел и выводить его в конце. А еще потом полученные времена умножим на требуемую память и количество строк кода. чтобы получить агрегатный параметр сравнения
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38178 / 21113 / 4307
Регистрация: 12.02.2012
Сообщений: 34,716
Записей в блоге: 14
19.10.2014, 18:43
Цитата Сообщение от _Ivana Посмотреть сообщение
я бы предложил господам D_in_practice, Mr.X, Catstail и TheCalligrapher
- а где взять в C/С++ очень большие числа? Это не Лисп и не Haskell - арифметику придется реализовывать.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.10.2014, 19:29
Ну хотя бы до максимального беззнакового целого - long long unsigned int. Думаю, разница будет заметна и в этом случае.

Добавлено через 42 минуты
UPD вот http://ideone.com/eEPIi7 ваш код не влезает в лимит 5 секунд при n=1E8, и вот http://ideone.com/ayL122 мой код, который тратит 0 (ноль ) секунд при n=1E10.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.10.2014, 19:29
Цитата Сообщение от _Ivana Посмотреть сообщение
А в плане оптимальности и практической применимости я бы предложил господам D_in_practice, Mr.X, Catstail и TheCalligrapher посоревноваться со мной временем выполнения алгоритмов и требуемой памятью на очень больших числах
Согласно современным воззрениям, простота и понятность программы ценнее ее быстродействия и экономии памяти.
Я согласен с этой концепцией, поэтому, честно говоря, не являюсь фанатом быстродействия, экономии памяти и программных строчек.
Как-то это по-сишному очень.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.10.2014, 19:33
Не хочется возобновлять давнишний спор, но у меня есть вполне определенное мнение о простоте (а также скорости и памяти) моего кода из пяти строчек по сравнению с многоэкранными простынями кода, который еще и еле шевелится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.10.2014, 19:33
Помогаю со студенческими работами здесь

Найти все натуральные n-значные числа, цифры в которых образуют строго возрастающую последовательность
Найти все натуральные n-значные числа, цифры в которых образуют строго возрастающую последовательность (например, 1234, 5789) На языке с++.

Найти все натуральные n-значные числа, цифры в которых образуют строго возрастающую последовательность
Ребят,помогите сделать эту задачу через массивы.Я сделал через строки но мне сказали переделать ее через массивы Задача: Найти все...

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

Найти все натуральные числа (не больше N), десятичная запись которых - строго возрастающая последовательность цифр
Прошу помощи с этим заданием, заранее благодарна : Найти все натуральные числа, которые не больше заданного n, десятичная запись которых -...

Найти натуральные числа до N, десятичная запись которых - строго возрастающая или строго убывающая последовательность
Найти все натуральные числа не превосходящие заданного n, десятичная запись которых есть строго возрастающая или строго убывающая...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru