powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Оптимизация диапазона чисел
16 сообщений из 16, страница 1 из 1
Оптимизация диапазона чисел
    #33299895
newteapot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, уважаемые старожилы!

Нужда несказанная заставила обратиться к вам за помощью:((

Задача такая: есть телефонные коды городов, описанные диапазонами целых чисел.

a - начало диапазона, b - конец диапазона

условия:
b - a = [0 to 1 000 000];
len(a) = len(b) = [1 to 1 000 000 000 000] (любое очень большое число, не поддающееся CLng).

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

Пример: диапазон 55550001-55559999 описывается так:
55550001
55550002
55550003
55550004
55550005
55550006
55550007
55550008
55550009
55551
55552
55553
55554
55555
55556
55557
55558
55559
А диапазон 55550000-55550000 описывается как 55550000.
Буду очень благодарен как за код для этой задачи, так и за любые идеи по ее решению.
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33299904
newteapot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл важное: бд в Access, язык - VBA
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33300002
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему бы Вам не задать этот вопрос в форуме по Аксессу?
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33300003
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И кстати: какова роль БД? Числа сидят в ней или как?
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33300251
newteapot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Числа импортируются в БД.
кстати, первые несколько цифр начала и конца диапазона совпадают.
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33300253
newteapot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос больше относится к программированию, чем к СУБД, как мне кажется.
В принципе же числа могут и не импортироваться в БД, а быть в текстовом или любом ином документе, так что это вопрос по VBA, как мне кажется.
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33301402
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newteapot есть телефонные коды городов, описанные диапазонами целых чисел.
Нужно определить все числа диапазона таким образом, чтобы если в диапазоне есть число (числа), которое(ые) порядком(ами) меньше чисел из диапазона, но полностью описывает(ют) их слева, то вместо такого поддиапазона проставляется это число (например, 5555 описывает диапазон 55550000-55559999, т.к. любое количество любых цифр, следующих за 5555 подпадает в указанный диапазон. Следует учитывать, что количество цифр, следующих за младшим(родительским) порядком не имеет значения, т.к. указанные числа в данной задаче являются телефонными кодами дозвона).
...любые идеи по ее решению.
1. Выделить термы, содержащие телефоны (с кодами дозвона).
2. К термам применить оператор VB (VBA) Like:
result = string Like pattern
Например, строка s = "55551234-w-234" (№ телефона-пауза-№ внутр.тел):
Код: plaintext
If s Like "5555[0-9][0-9][0-9][0-9]*" Then s = "5555"
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33302057
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newteapotПример: диапазон 55550001-55559999 описывается так:
55550001
55550002
55550003
55550004
55550005
55550006
55550007
55550008
55550009
55551
55552
55553
55554
55555
55556
55557
55558
55559
Мне кажется, что тут ошибка. Номера от 55550010 до 55550999 остались за бортом. Дело в том, что я почти написал программу и долго не мог добиться, чтобы она выдавала такой ответ, как тут. И вот оказалось, что здесь ответ неправильный. Короче, я еще чуть-чуть поотлаживаю и выложу сюда. Если баги остались, пусть кто-нибудь их добьет.
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33302084
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, вот оно. Вроде работает (тьфу-тьфу):

Код: plaintext
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.
Sub X(sFrom As String, sTo As String, Optional nPos As Integer =  1 )

Dim nFrom As Integer, nTo As Integer, i As Integer, nMaxLen As Integer

If sFrom = sTo Then
    Debug.Print sFrom
    Exit Sub
End If

nFrom = Val(Mid(sFrom, nPos,  1 ))
nTo = Val(Mid(sTo, nPos,  1 ))
nMaxLen = Len(sTo)
If Len(sFrom) > nMaxLen Then nMaxLen = Len(sFrom)

If nTo = nFrom Then
    X sFrom, sTo, nPos +  1 
ElseIf Mid(sFrom, nPos) = String(nMaxLen - nPos +  1 , "0") And _
       Mid(sTo, nPos) = String(nMaxLen - nPos +  1 , "9") Then
    Debug.Print Left(sFrom, nPos -  1 )
Else
    X sFrom, Left(sFrom, nPos) & String(nMaxLen - nPos, "9"), nPos +  1 
    If nTo - nFrom >  1  Then
        For i = nFrom +  1  To nTo -  1 
            Debug.Print Left(sFrom, nPos -  1 ) & CStr(i)
        Next
    End If
    X Left(sTo, nPos) & String(nMaxLen - nPos, "0"), sTo, nPos +  1 
End If

End Sub
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33302238
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у кого-то возник вопрос, зачем у этой процедуры третий параметр, то вот вариант без него:

Код: plaintext
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.
Sub X(sFrom As String, sTo As String)

Dim nFrom As Integer, nTo As Integer, i As Integer, nMaxLen As Integer
Dim nPos As Integer, nMinLen As Integer

If sFrom = sTo Then
    Debug.Print sFrom
    Exit Sub
End If
nMaxLen = Len(sTo)
If Len(sFrom) > nMaxLen Then nMaxLen = Len(sFrom)
nMinLen = Len(sTo)
If Len(sFrom) < nMinLen Then nMinLen = Len(sFrom)
nPos =  0 
For i =  1  To nMinLen
    If Mid(sFrom, i,  1 ) <> Mid(sTo, i,  1 ) Then
        nPos = i
        Exit For
    End If
Next
nFrom = Val(Mid(sFrom, nPos,  1 ))
nTo = Val(Mid(sTo, nPos,  1 ))

If nTo = nFrom Then
    X sFrom, sTo
ElseIf Mid(sFrom, nPos) = String(nMaxLen - nPos +  1 , "0") And _
       Mid(sTo, nPos) = String(nMaxLen - nPos +  1 , "9") Then
    Debug.Print Left(sFrom, nPos -  1 )
Else
    X sFrom, Left(sFrom, nPos) & String(nMaxLen - nPos, "9")
    If nTo - nFrom >  1  Then
        For i = nFrom +  1  To nTo -  1 
            Debug.Print Left(sFrom, nPos -  1 ) & CStr(i)
        Next
    End If
    X Left(sTo, nPos) & String(nMaxLen - nPos, "0"), sTo
End If

End Sub
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33302450
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще небольшая оптимизация.

Код: plaintext
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.
Sub X(sFrom As String, sTo As String)

Dim nFrom As Integer, nTo As Integer, i As Integer, nMaxLen As Integer
Dim nPos As Integer, nMinLen As Integer

If sFrom = sTo Then
    Debug.Print sFrom
    Exit Sub
End If

nMaxLen = Len(sTo)
If Len(sFrom) > nMaxLen Then nMaxLen = Len(sFrom)
nMinLen = Len(sTo)
If Len(sFrom) < nMinLen Then nMinLen = Len(sFrom)
nPos =  0 
For i =  1  To nMinLen
    If Mid(sFrom, i,  1 ) <> Mid(sTo, i,  1 ) Then
        nPos = i
        Exit For
    End If
Next

If Mid(sFrom, nPos) = String(nMaxLen - nPos +  1 , "0") And _
   Mid(sTo, nPos) = String(nMaxLen - nPos +  1 , "9") Then
    Debug.Print Left(sFrom, nPos -  1 )
    Exit Sub
End If

nFrom = Val(Mid(sFrom, nPos,  1 ))
nTo = Val(Mid(sTo, nPos,  1 ))
X sFrom, Left(sFrom, nPos) & String(nMaxLen - nPos, "9")
If nTo - nFrom >  1  Then
    For i = nFrom +  1  To nTo -  1 
        Debug.Print Left(sFrom, nPos -  1 ) & CStr(i)
    Next
End If
X Left(sTo, nPos) & String(nMaxLen - nPos, "0"), sTo

End Sub
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33302483
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
четал, четал... - ничего не не вычетал.

так и не понял в чем в точности дело.

ну, например, почему 55550004- это "правильный" номер,
а номера 55551234 не должно получаться в потоке вывода?

а вот такие вызовы
Код: plaintext
1.
2.
 X "555501", "55559999"
  X "55550000", "55559999"
по постановке задачи - допустимы или нет?
и, если допустимы - что на выходе каждого из них должно получиться?
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33302490
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет правильного и неправильного - думаю, что это ошибка.

Насчет X "555501", "55559999" - у меня пока не обрабатывается, но вот поправка, чтобы обрабатывалось. Вместо первого ифа с экзитом надо поставить два таких:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
If sFrom = sTo Or sTo Like sFrom & "*" Then
    Debug.Print sFrom
    Exit Sub
End If
If sFrom Like sTo & "*" Then
    Debug.Print sTo
    Exit Sub
End If

Насчет X "55550000", "55559999" - да, и ответ будет 5555.
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33302500
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Насчет X "55550000", "55559999" - да, и ответ будет  5555 .
пусть будет.

задачу я не понял совсем.

она тайная или не может в иных предложениях быть сформулирована?
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33303217
newteapot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое всем!
Отдельное большущее спасибо Владимиру Санычу за код!!!
Я подошел к задаче совершенно с иной стороны, а очевидного, как оказалось, и не заметил. Задачу я решил при помощи StrReverse(Val(StrReverse(...))), но мое решение длиннее, код Владимира Саныча лаконичнее и, главное, быстрее.
Диапазон 55550010 - 55550999 я действительно пропустил, прошу прощения...
Спасибо еще раз!
...
Рейтинг: 0 / 0
Оптимизация диапазона чисел
    #33305005
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victoshaзадачу я не понял совсем.

она тайная или не может в иных предложениях быть сформулирована?
Мне почему-то удалось понять... Список телефонных номеров может быть задан двумя способами: либо как от номера до номера, либо как список начал номеров (например, интервал от 110 до 119 записывается как 11). Задача состояла в том, чтобы перевести список, заданный первым способм, во второй способ.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Оптимизация диапазона чисел
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]