Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2009, 05:44   #1
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Числа шестнадцатеричные (16-ричные) и обычные: разложение на простые множители

Код:
Sub JustFrac()
'Делит выделенное целое число на его наименьший простой делитель.'
'Когда само это число простое и > 10 000 000, этот алгоритм слишком долог.'

Static NextRun As Boolean, isHexN As Boolean
Dim i As Variant, N As Variant, n2 As Variant, as_3_5_7 As Integer, answer As Long
Dim proportion As Variant, radical As Variant
Dim d0 As Date, t0 As Date, t01 As Single, d1 As Date, t1 As Date, t02 As Single
Dim dumn0 As String, dumn As String

ActiveWindow.ActivePane.View.ShowAll = False 'отключаем отображение знаков пробела'

dumn0 = Selection.Text 'выделенный вами/программой текст (предположительно с числом!)'
If Asc(LTrim(dumn0)) < 48 Then dumn0 = 8 'если выделен невменяемый (нецифробуквенный) текст'

For i = 1 To Len(dumn0)
    If Mid(dumn0, i, 1) Like "[0-9A-Fa-f]" Then dumn = dumn & Mid(dumn0, i, 1)
    If Mid(dumn0, i, 1) Like "[A-Fa-f]" Then isHexN = True
Next    'убрали из числа (делимого) пробелы, табуляции, знаки абзаца и разделители разрядов'



With Selection
    .EndKey unit:=wdStory   'курсор - в конец файла'
    .TypeParagraph              'печать абзаца'
    
N = InputBox("What is your N?", ActiveDocument, dumn)   'ввод N'
If N = vbNullString Then Exit Sub

If Not NextRun Then
    If Not isHexN Then answer = MsgBox("16-ричное будем делить?", vbYesNo + vbDefaultButton2)
    If answer = vbYes Then isHexN = True
End If

If IsNumeric(N) Or isHexN Then
    If isHexN Then 'преобразование введённого числа в число типа Decimal (29 десятичн. знаков)'
    If Len(N) < 12 Then N = CDec("&H" & UCase(N)) Else MsgBox "It’s too big.": isHexN = False: Exit Sub
    Else
    N = CDec(N)
    End If
    radical = Sqr(N) 'квадратный корень (при "зависании" i должно его превзойти, тогда всё OK)'
Else
    MsgBox "Alas, not numeric!": Exit Sub
End If
End With


MsgBox "square radical(" & N & ") " & IIf(radical = Fix(radical), "= ", "~ ") & radical
If N = 1 Or N = 0 Then isHexN = False: Exit Sub
                            
                            d0 = Date: t0 = Time: t01 = Timer 'ЗАСЕКЛИ ВРЕМЯ'

i = 0
n2 = N

        proportion = N / 2
Do
        If proportion = Fix(proportion) Then
            Selection.TypeParagraph
            Selection.TypeText n2 & " = " & 2 & "·" & n2 / 2
            n2 = n2 / 2
            proportion = n2 / 2
            i = i + 1
        Else: If i = Empty Then Exit Do Else i = 2 ^ i: GoTo CHRONOS
        End If
Loop

i = 0
For as_3_5_7 = 3 To 7 Step 2
        
                proportion = N / as_3_5_7
        Do
            If proportion = Fix(proportion) Then
                Selection.TypeParagraph
                Selection.TypeText n2 & " = " & as_3_5_7 & "·" & n2 / as_3_5_7
                n2 = n2 / as_3_5_7
                proportion = n2 / as_3_5_7
                i = i + 1
            Else: If i = Empty Then Exit Do Else i = as_3_5_7 ^ i: GoTo CHRONOS
            End If
        Loop
Next



'Подошли наконец к тому, что этот делитель нечётный и больше 7.'

i = 11

Do
        proportion = N / i
    If proportion = Fix(proportion) Then
        Selection.TypeParagraph
        Selection.TypeText N & " = " & i & "·" & N / i
        Exit Do
    End If
    i = i + 2
Loop


CHRONOS:                    d1 = Date: t1 = Time: t02 = Timer 'ВРЕМЯ ОКОНЧАНИЯ'

If i > 1 Then MsgBox N & " devided by " & "i (i = " & i & ")." Else Exit Sub

If Abs(t02 - t01) > 0.001 And N > 0 Then _
    MsgBox "Start:" & vbTab & "date = " & Format(d0, "yyyy-mm-dd") & vbLf & _
    vbTab & "time = " & Format(t0, "H:nn:ss") & vbLf & vbLf & _
        "Ready:" & vbTab & "date = " & Format(d1, "yyyy-mm-dd") & vbLf & _
    vbTab & "time = " & Format(t1, "H:nn:ss") & vbLf & vbLf & _
        "Total (by date):" & vbTab & DateDiff("s", t0, t1) & " second(s)" & vbLf & _
        "Total (by time):" & _
    vbTab & _
    IIf(t02 >= t01, FormatNumber(t02 - t01, 2), FormatNumber(t02 + 86400 - t01, 2)) _
    & " second(s)" & vbLf & _
    vbTab & "(if totally less than 1 day)" & vbLf & vbLf & _
"Average speed:" & vbTab & FormatNumber(i / (t02 - t01) / 10 ^ 6, 2) & vbLf & vbTab & vbTab & _
"m i l l i o n  numbers  per 1 second" & vbLf & vbTab & vbTab & _
"(миллиона чисел за 1 секунду)"

Selection.MoveLeft wdWord, 1, wdExtend 'выделили напечатанное частное (от деления N на i)'
If Not NextRun Then NextRun = True
Call JustFrac 'продолжение'
End Sub

Последний раз редактировалось Sasha_Smirnov; 16.01.2009 в 05:28. Причина: учёт того, что числа могут быть и шестнадцатеричными.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 16.01.2009, 00:33   #2
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Отформатированный и отлаженный исходник

Ещё бы двоичные числа делить...
А шестнадцатеричные, как оказалось, Word «переваривает» вплоть до FFF FFFF FFFF FFFF.
Так что Len(N) < 12 — это я перестраховался! Поэтому (и не только) ту строчку заменим на
Код:
    If Len(N) < 16 Then N = CDec("&H" & UCase(N)): isHexN = False Else MsgBox "It’s too big.": Exit Sub

Последний раз редактировалось Sasha_Smirnov; 16.01.2009 в 23:23. Причина: повышение охвата 16-ричных значений.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 16.01.2009, 01:25   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
Что-то при импорте в форум выделения цветом не происходит. Ну не суть!
Я спрашивал об этом у админа, говорит, что VB не поддерживаестя
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 16.01.2009, 01:31   #4
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Так это и без вопросов было ясно! Его изучают одиночки.
Испытали бы вы лучше мой "дрынолёт"!
Sasha_Smirnov вне форума Ответить с цитированием
Старый 16.01.2009, 01:41   #5
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
Так это и без вопросов было ясно! Его изучают одиночки.
Испытали бы вы лучше мой "дрынолёт"!
Ну, не сердись «Дрынолет» хорош. Только поздно уже для теоретической математики (для прикладной тоже). Завтра посмотрим (хотя уже сегодня)
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 17.01.2009, 09:39   #6
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Посмотрел, интересно. Не пойму как работает вот это:
Код:
If Asc(LTrim(dumn0)) < 48 Then dumn0 = 8 'если выделен невменяемый (нецифробуквенный) текст'
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 17.01.2009, 19:27   #7
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

А это вставляет "8" в инпутбокс, когда вы в тексте не выделили число.
Практически, заглушка. (48 — [юни]код нуля, а меньше — цифр нет.)

Здравствуйте, отпускники и трудоголики!

Обнаружил свою не закрытую пока тему и решил её развить.

Оказалось, что на это нужно целых полчаса (из которых %50 ушло на поиск кода кнопки*, запускающей макрос)!

Отсюда напрашивается вывод, что до сих пор тема как следует не работала, несмотря на 430 просмотров, — не зная ничего о том, как работает VBA, мало кто сподобится самостоятельно использовать вышеприведённый код.

Посему и прилагаю его в документе.


___________________________
* © Капитан Немо
* О запуске программы (любого макроса), если такой кнопки нет, смотрите здесь (абзац 3).

Пришлось код кнопки несколько дополнить (см. внутри, по альт-F11).

Иначе выделенное в тексте число не разлагалось на множители.

Есть тут (внизу, в похожих темах) подобная программка от Kostia, но там предел 32767 (тип интэджер), и я не могу сравнить быстродействие. Моя же делит тип дэсимал (29 десятичных знаков) и за секунду перебирает (в обратной зависимости от введённого предела) от 3 млн до 100 тыс. делителей (пропуская, конечно, чётные).

Было бы любопытно посмотреть то же самое на Си, приложите экзешник, если есть.

О количестве простых чисел можно узнать и вот здесь.

P/s: говорят, что VBA язык очень медленный, и хочу понять — насколько. И наверно, не я один.

Замечу, что на сайте http://ru.numberempire.com/numberfactorizer.php допустимая длина числа 60 цифр!

И работает (раскладывает на множители) довольно быстро.
Вложения
Тип файла: doc Factors.doc (51.5 Кб, 31 просмотров)
Тип файла: doc PrimeFactors.doc (68.0 Кб, 47 просмотров)

Последний раз редактировалось Stilet; 06.05.2015 в 08:45.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 05.05.2015, 22:07   #8
Saggio
Новичок
Джуниор
 
Регистрация: 05.05.2015
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
Замечу, что на сайте http://ru.numberempire.com/numberfactorizer.php допустимая длина числа 60 цифр!

И работает (раскладывает на множители) довольно быстро.
Добрый вечер. а как Вам написать личное сообщение?
Saggio вне форума Ответить с цитированием
Старый 06.05.2015, 03:28   #9
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

А никак. Пишите по теме что-нибудь. Спасибо за интерес.
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
разложение на простые множители pakusya Помощь студентам 2 19.12.2011 15:55
Разложение числа на множители spamer Общие вопросы Delphi 5 01.01.2009 12:32
Паскаль. Разложение на множители. Arizonec Помощь студентам 3 13.11.2008 00:41
Разложение числа на простые множители artem_MG Паскаль, Turbo Pascal, PascalABC.NET 3 24.10.2008 19:28
Любителям компонентного программирования JTG Софт 1 08.04.2008 14:42