Страницы: 1
RSS
Определить простое ли число или составное (без VBA)
 
Здравствуйте! Как определить простое ли число или составное в эксель без VBA?!  
 
Добрый день. Вот такое соорудил, только на 1 выдает ошибку.
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Можно как-то так формулой массива:
P.S. Добавил проверку на 1
Код
=ЕСЛИ(В1=1;"простое";ЕСЛИ(СУММ(--(ОСТАТ(В1;СТРОКА(СМЕЩ($A$1;0;0;В1;1)))=0))=2;"простое";"составное"))

В В1 - исследуемое число.
Изменено: Пытливый - 27.12.2016 12:37:12
Кому решение нужно - тот пример и рисует.
 
Код
=ЕСЛИ(B1=1;"Простое";ЕСЛИ(СУММ(--(ОСТАТ(B1;СТРОКА(ДВССЫЛ("1:"&B1)))=0))=2;"Простое";"Составное"))
Для этой формулы не нужен список чисел на листе от 1 до исследуемого числа.
 
формула для больших чисел (больше 2^20):
=ЕСЛИ(И(ОСТАТ(A1;СТРОКА(СМЕЩ($A$2;;;A1^0,5)))<>0)+(A1<4);"Простое";"Составное")

l
 
Формула массива:
=ЕСЛИ(A1<4;"Простое";ЕСЛИ(И(ОСТАТ(A1;СТРОКА(A2:ИНДЕКС(A:A;A1-1)))<>0);"Простое";"Составное"))
 
Цитата
MCH написал:
формула для больших чисел (больше 2^20)
По задумке, формула должна работать для чисел до 2^40, т.е. до 1,1*10^12.
Однако, формула возвращает #ЧИСЛО! уже при 268'435'456, т.е. при 2^28  :(
Как я выяснил, это связано с ограничением функции ОСТАТ(х;у) - результат деления х/у должен быть меньше 2^27=134'217'728!
То есть ОСТАТ(134217727,9999;1) =0,9999, а ОСТАТ(134217728;1) =#ЧИСЛО!
ОСТАТ(2^27*3-1;3) =2, а ОСТАТ(2^27*3;3) =#ЧИСЛО!
и т.д.
Можно переписать формулу, не используя функцию ОСТАТ, тогда она действительно работает до 10^12, формула массива
Код
=ЕСЛИ(И(ЧАСТНОЕ(A1;СТРОКА(СМЕЩ($A$2;;;A1^0,5)))<>A1/СТРОКА(СМЕЩ($A$2;;;A1^0,5)))+(A1<4);"Простое";"Составное")
 
Можно расширить диапазон работы формулы еще в 4 раза, примерно до 4,3*10^12, если не проверять четные числа. Формула массива
Код
=ЕСЛИ(A1<4;"Простое";ЕСЛИ(ЕЧЁТН(A1);"Составное";ЕСЛИ(И(ЧАСТНОЕ(A1;СТРОКА(СМЕЩ($A$1;;;A1^0,5/2))*2+1)<>A1/(СТРОКА(СМЕЩ($A$1;;;A1^0,5/2))*2+1));"Простое";"Составное")))
 
UDF, которая достаточно быстро раскладывает на простые множители пятнадцатизначные числа (опубликовано здесь)
Код
Function PrimeFact$(ByVal n#)
    Dim i&, txt$
    If n < 4 Then
        PrimeFact = "Prime"
        Exit Function
    End If
    i = 3
    While Fix(n / 2) = n / 2
        n = Fix(n / 2)
        txt = txt & "*2"
    Wend
    While CDbl(i) * i <= n
        If Fix(n / i) <> n / i Then i = i + 2 Else n = Fix(n / i): txt = txt & "*" & i
    Wend
    If n > 1 Then txt = txt & "*" & n
    If InStr(2, txt, "*") Then PrimeFact = Mid$(txt, 2) Else PrimeFact = "Prime"
End Function 
Изменено: MCH - 28.12.2016 08:57:51
 
Bema, спасибо за пример, а если заменить =2 на <=2 это проблему с 1 не решит?
 
Дополнительная проверка на еденицу решит проблему.
=ЕСЛИ(A1=1;"Простое";ЕСЛИ(СУММ(--((ОСТАТ(A1;СТРОКА($B$1:СМЕЩ($B$1;A1-1;))))=0))=2;"Простое";"Составное"))
И формула работает до числа 65536, по количеству строк на листе Эксель.
Изменено: Bema - 28.12.2016 09:43:12
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Bema,  ну это как-то не изящно, надо добавлять 15 символов. Кстати 65536 можно увеличить до 1млн в новом экселе
Страницы: 1
Читают тему
Наверх