Что нового

[Математика] Функция разложения числа на множители

Rioran

Everything is possible and achievable.
AutoIt: Тестировалось на 3.3.12.0
Версия: 1.03

Категория: Вспомогательные функции, Строки, Математика.

Описание: Функция раскладывает число на множители и возвращает строку, где множители разбиты через символ звёздочки. Можно использовать в комбинации со StringSplit по символу "*" для получения массива множителей. Алгоритм показывает высокую производительность при работе с 19-ти значными числами.

Код/Пример:
Код:
Global $nNumber = 13414 ; Какое число разбиваем на множители
ConsoleWrite($nNumber & " = " & GetFactors($nNumber) & @CRLF)

func GetFactors($nVal)
; Автор VBA алгоритма:      Михаил "МСН", Источник: http://www.excelworld.ru/forum/7-18491-154442-16-1439576282
; Автор реализации на Au3:  Роман Rioran Воронов от 16 сентября 2015
; ----------------------------------------------------------------------
; Функция раскладывает число на множители и возвращает строку, где множители разбиты через символ звёздочки
; Function returns string of prime factors of given number, joined by asterisk sign
   Local $sText, $X = 3
   while IsInt($nVal / 2) And $nVal > 3
	  $nVal /= 2
	  $sText &= "*2"
   WEnd
   While $X*$X <= $nVal
	  If IsInt($nVal / $X) Then
		 $nVal /= $X
		 $sText &= "*" & $X
	  Else
		 $X += 2
	  EndIf
   WEnd
   return StringMid($sText & "*" & $nVal, 2)
EndFunc


История версий:
1.00: первая публичная версия
1.01: поправка для простых чисел - удалён лишний символ.
1.02: упрощён синтаксис с помощью операторов с присвоением и проверки делимости через IsInt.
1.03: теперь переменная Х инициализируется с присовением значения.

Источник: excelworld.ru

Автор(ы):
Автор VBA алгоритма: Михаил "МСН"
Автор реализации на Au3: Роман "Rioran" Воронов
 

AZJIO

Меценат
Меценат
Rioran
Число двоек можно получить так
Код:
Int(Log($Value) / Log(2))
 
Автор
Rioran

Rioran

Everything is possible and achievable.
AZJIO, спасибо, интересный вариант. Однако у меня не получается прикрутить его так, чтобы размер кода и количество операций сократилось или осталось тем же. Однако, это натолкнуло меня на мысль использовать IsInt для упрощения проверок.

Skif_off, это будет уже другая функция. Вам нужно разбить число на степени двойки? 13 = 8 + 4 + 1? Нужная функция на сайте уже есть ЗДЕСЬ, достаточно только, перебирая строку двоичного числа, заменять единички на двойку в степени "номер позиции справа минус один". Хотя ту функцию для 10-тичной системы можно было бы упростить. Если я Вас правильно понял - подтвердите - то могу написать такую функцию.
 

Skif_off

Знающий
Rioran, да, имел в виду 13 = 1+4+8 и 0:rofl: = 0x1+0x4+0x8, если возможно и не отнимет много времени.
 
Автор
Rioran

Rioran

Everything is possible and achievable.
Skif_off, готово, приглашаю с этим вопросом перейти в новую созданную мной тему ЗДЕСЬ. Общий алгоритм разложения на слагаемые степени двойки сделал, все хотелки оставлять там.
 
Верх