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

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

Войти
Регистрация
Восстановить пароль
 
Жанерке
34 / 34 / 2
Регистрация: 22.09.2013
Сообщений: 170
#1

лексикографически упорядочены числа - C++

25.01.2014, 20:24. Просмотров 1026. Ответов 11
Метки нет (Все метки)

В отличие от обычной математики числа здесь упорядочены не по возрастанию, а лексикографически, то есть как в словаре (сначала по первой цифре, затем, при равной первой цифре – по второй, и так далее). В данной науке используется первые N чисел. Так, например, если N=15, то числа в странной математике оказываются упорядочены следующим образом: 1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9.

надо int переводить в char что бы сортировать как слова по алфавиту ?
или как?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2014, 20:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос лексикографически упорядочены числа (C++):

C++ упорядочены ли числа последовательности по убыванию - C++
вот сама задача: Даны натуральные числа A1, A2, ... . Признак конца последовательности 0. Определить упорядочены ли числа...

Указать, упорядочены ли числа в массиве по возрастанию. - C++
Помогите написать программы, срочно до вторника следующего нужно, в долгу не останусь, кто сможет пишите в личку, обсудим стоимость и...

Определить, упорядочены ли в массиве по возрастанию четные числа - C++
не могу понять в чём проблема и почему не работает Дана последовательность целых чисел a1, ..., an. Определить, упорядочены ли в ней по...

Напишите программу, которая определяет, упорядочены ли цифры числа по возрастанию - C++
Помогите пожалуйста не могу решить задачу. Задачу нужно решить на С++ Задача: Напишите программу, которая определяет, упорядочены ли...

Работа со списками (Проверить, упорядочены ли числа по возрастанию или по убыванию) - C++
Прошу помощи! Задача звучит так:"Дан список вещественных чисел. Проверить, упорядочены ли числа по возрастанию или по убыванию." Причем...

Если целые числа упорядочены по возрастанию (a<b<c<d) сменить порядок их следования на противоположный - C++
Если целые числа упорядочены по возрастанию (a&lt;b&lt;c&lt;d) сменить порядок их следования на противоположный

11
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.01.2014, 21:21 #2
Цитата Сообщение от Жанерке Посмотреть сообщение
надо int переводить в char что бы сортировать как слова по алфавиту ?
Какая конечная цель? Если нужно отсортировать массив чисел, то можно просто написать свою функцию сравнения. Например так:
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
#include <algorithm>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
 
int main() {
    
    std::vector<int> v = { 1, 2, 3, 4, 10, 20, 30, 40 };
    
    std::sort( v.begin(), v.end(), [](int l, int r)
        { 
            std::stringstream ss;
            ss << l;
            std::string ls = ss.str();
            ss.str("");
            ss << r;
            return ls < ss.str();
        } );
        
    for( const int i : v )
    {
        std::cout << i << " ";
    }
    std::cout << '\n';
    
    return 0;
}
http://ideone.com/PIy8mJ
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
25.01.2014, 21:22 #3
Жанерке, вообще, существует четкий алгоритм. Относится к комбинаторике.
Генерация перестановок в лексикографическом порядке
1
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
25.01.2014, 22:24 #4
Цитата Сообщение от nexen Посмотреть сообщение
Жанерке, вообще, существует четкий алгоритм. Относится к комбинаторике.
я его не читал, но свой предложу, может корявый немного:

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
#include <iostream>
 
int main()
{
int n,i,j,c=1,z,g;
bool t;
std::cin>>n;
for (i=1; i<=9; i++)
{
c=i;
std::cout<<i<<" ";
g=1;
z=1;
if (c*10<n)
while (c*10<=n) {c*=10; g*=10;}
while (z*10<=n) {z*=10; }
j=i*10;
while (c>=10)
{
  t=(c==z)? (j<=n):(j<(i+1)*g);
while (t)
{
    std::cout<<j<<" ";
    j = (n>=j*10) ? j*10: j+1; 
     t=(c==z)? (j<=n):(j<(i+1)*g);
}
    c/=10;
    g/=10;
if (c>1) j=c+1;
}
}
 
std::system ("Pause");
return 0;
}
Добавлено через 11 минут
поторопился Понимаю что 16 строку целесообразней вынуть за пределы цикла for. Алгоритм составлял руками думая и одновременно набирая
1
mms_ua
44 / 44 / 7
Регистрация: 06.09.2010
Сообщений: 98
26.01.2014, 01:25 #5
Для произвольного исходного массива я рискнул бы предложить следующий вариант
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
#include <stdio.h>
 
#define MAX 2000
 
unsigned int source[MAX];
unsigned int bdc[MAX];
 
 
unsigned int invert(unsigned int rv)
{
    unsigned int lv;
    unsigned int add=1;
    lv=rv+0x06*(rv/10)+0x060*(rv/100)+0x0600*(rv/1000)+0x06000*(rv/10000)+0x060000*(rv/100000);
 
    rv=lv;
    do
    {
        rv=rv>>4;
        lv+=add;
        add=add<<4;
    } while(rv);
    while(lv<0x10000000) lv=lv<<4;
    return lv;
}
 
void sort()
{
    unsigned int min,ix,st;
    for (st=0;st<MAX;st++)
    {
        for (ix=st;ix<MAX;ix++)
        {
            if (bdc[ix]<bdc[st])
            {
                min=bdc[ix];
                bdc[ix]=bdc[st];
                bdc[st]=min;
 
                min=source[ix];
                source[ix]=source[st];
                source[st]=min;
            }
        }
    }
}
 
void init()
{
    unsigned int ix;
    for (ix=0;ix<MAX;ix++)
    {
        source[ix]=ix;
        bdc[ix]=invert(ix);
    }
}
 
void dump()
{
    int ix;
    for (ix=0;ix<MAX;ix++)
    {
        printf("%04d : %d\n",ix+1,source[ix]);
    }
}
 
 
int main()
{
    init();
    sort();
    dump();
    return 0;
}
Очевидно, что алгоритм сортировки можно использовать любой. Для функции invert значения исходного массива могут лежать в диапазоне от 0 до 999999. Ну а в данном примере я его забил от 0 до 2000...
1
Жанерке
34 / 34 / 2
Регистрация: 22.09.2013
Сообщений: 170
26.01.2014, 09:07  [ТС] #6
mustimur, в вашем коде если ввести цифру меньше девяти , например 5, оно все равно выводит все 9 цифр. а так прога норм.

всем спасибо за помощь
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
26.01.2014, 10:30 #7
упс.. Исправить 8 строчку for (i=1; i<=9; i++) заменить на for (i=1; i<=(n>8) ? 9:n; i++)
0
Жанерке
34 / 34 / 2
Регистрация: 22.09.2013
Сообщений: 170
26.01.2014, 14:51  [ТС] #8
mustimur, я там условие и цикл добавила
тож работает)

C++
1
2
3
4
5
............................
if (n<9) for (i=1; i<=n; i++) std::cout<<i<<" ";
else
for (i=1; i<=9; i++)
.......................
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
26.01.2014, 15:52 #9
Одна задача 100 решений))
0
Жанерке
34 / 34 / 2
Регистрация: 22.09.2013
Сообщений: 170
26.01.2014, 18:25  [ТС] #10
mustimur, как можно результат записать в массив одномерный, что бы можно было сделать поиск и выводить позицию числа .
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
26.01.2014, 20:02 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Жанерке Посмотреть сообщение
mustimur, как можно результат записать в массив одномерный, что бы можно было сделать поиск и выводить позицию числа .
не совсем понял задачу, вот вместо печати запись в массив:
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 <iostream>
 
int main()
{
int n,i,j,c=1,z,g, ks=0;
bool t;
std::cin>>n;
int *ms = new int[n];
for (i=1; i<=((n>8) ? 9:n); i++)
{
c=i;
ms[ks]=i;
ks++;
g=1;
z=1;
if (c*10<n)
while (c*10<=n) {c*=10; g*=10;}
while (z*10<=n) {z*=10; }
j=i*10;
while (c>=10)
{
  t=(c==z)? (j<=n):(j<(i+1)*g);
while (t)
{
   ms[ks]=j;
   ks++;
    j = (n>=j*10) ? j*10: j+1; 
     t=(c==z)? (j<=n):(j<(i+1)*g);
}
    c/=10;
    g/=10;
if (c>1) j=c+1;
}
}
for (i=0;i<n;i++) std::cout<<ms[i]<<" ";
 
 delete [] ms; 
std::system ("Pause");
return 0;
}
1
Жанерке
34 / 34 / 2
Регистрация: 22.09.2013
Сообщений: 170
26.01.2014, 21:12  [ТС] #12
mustimur, спасибо, все работает.

задача решена, тема закрыта)))))))
0
26.01.2014, 21:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2014, 21:12
Привет! Вот еще темы с ответами:

Проверить, упорядочены ли три заданных вещественных числа по возрастанию / убыванию и изменить их по условию - C++
Даны вещественные числа n, m, p. Если они упорядочены по возрастанию, заменить их квадратами. Если упорядочены по убыванию, увеличить в 2...

Дано натуральное n. Определить, упорядочены ли по возрастанию или по убыванию цифры в записи этого числа - C++
Дано натуральное n. Определить, упорядочены ли по возрастанию или по убыванию цифры в записи этого числа. У меня сделано,...

Сравнение двух строк лексикографически с++ - C++
Маленький Петя очень любит подарки. Его мама подарила ему на день рождения две строки равной длины, состоящие из больших и маленьких букв...

Найти лексикографически минимальный палиндром, который можно получить из слова S - C++
У Максима есть слово S, и он очень хочет сделать из него палиндром, но не желает изменять слишлом большое количество символов. Помогите...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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