Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Оптимизация диапазона чисел / 16 сообщений из 16, страница 1 из 1
01.10.2005, 18:14:27
    #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
01.10.2005, 18:42:26
    #33299904
newteapot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация диапазона чисел
Забыл важное: бд в Access, язык - VBA
...
Рейтинг: 0 / 0
01.10.2005, 23:06:46
    #33300002
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация диапазона чисел
Почему бы Вам не задать этот вопрос в форуме по Аксессу?
...
Рейтинг: 0 / 0
01.10.2005, 23:08:42
    #33300003
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация диапазона чисел
И кстати: какова роль БД? Числа сидят в ней или как?
...
Рейтинг: 0 / 0
02.10.2005, 18:43:35
    #33300251
newteapot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация диапазона чисел
Числа импортируются в БД.
кстати, первые несколько цифр начала и конца диапазона совпадают.
...
Рейтинг: 0 / 0
02.10.2005, 18:47:32
    #33300253
newteapot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация диапазона чисел
Вопрос больше относится к программированию, чем к СУБД, как мне кажется.
В принципе же числа могут и не импортироваться в БД, а быть в текстовом или любом ином документе, так что это вопрос по VBA, как мне кажется.
...
Рейтинг: 0 / 0
03.10.2005, 14:17:58
    #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
03.10.2005, 17:55:24
    #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
03.10.2005, 18:01:15
    #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
03.10.2005, 18:46:30
    #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
03.10.2005, 22:14:38
    #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
03.10.2005, 22:45:29
    #33302483
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация диапазона чисел
четал, четал... - ничего не не вычетал.

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

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

а вот такие вызовы
Код: plaintext
1.
2.
 X "555501", "55559999"
  X "55550000", "55559999"
по постановке задачи - допустимы или нет?
и, если допустимы - что на выходе каждого из них должно получиться?
...
Рейтинг: 0 / 0
03.10.2005, 22:56:23
    #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
03.10.2005, 23:10:05
    #33302500
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация диапазона чисел
Код: plaintext
Насчет X "55550000", "55559999" - да, и ответ будет  5555 .
пусть будет.

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

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

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


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