А при чем тут лонг? Тут же исключительно с цифирями работа. Ну да, понимаю, хоцца все в один цикл всунуть. Дык попробуй-ка 17-ю цифру слева у 30-разрядного числа быстро извлечь. Каждое число - массив или строка цифирей. Увеличение числа - ручками моделировать. Да все равно долго, коллайдер быстрее сработает :)
Вывод - таки нужен другой алгоритм, НЕ переборный. Или УмноПереборный. Например понятно, что нужно искать просто наборы цифирей, а то что эти числа поставленные в ряд могут образовать какое-то число для самой задачи вообще не существенно. Далее - если сумма чисел является простым числом - пропускаем. И т.п.
Mathemat>>: А при чем тут лонг? Тут же исключительно с цифирями работа. Ну да, понимаю, хоцца все в один цикл всунуть. Дык попробуй-ка 17-ю цифру слева у 30-разрядного числа быстро извлечь.
Лонг при том, что произведение 30 чисел в среднем равных 5 == 5^30
// ~ == 9,31323E+20 (а в лонге умещается максимум 15 десятичных разрядов)
MetaDriver>>: Вожусь немножко с №226. Вьехал, что точки лежат не только на окружностях с центром в точке == центру многоугольника, но и на наборе окружностей "половинного" диаметра прижатых к краям 1976-угольника. Это легко понять, если представить себе место середин точек всех хорд пересекающих окружность одним из своих концов в фиксированной точке. Возможно на этих окружностях лежат ещё какие-то "полуточки". (с) Т.е. ответ будет возможно больше чем очевидный минимум (1976). Думаю дальше. // Кстати, 1976 == 2*2*2*13*19 // Не знаю поможет ли это делу. Но во внимание принимаю. :)
Думаю ответ не может быть больше 1976.
но с доказательством пока туговато.
Один факт из книжки Коэна о диофантовых уравнениях: Вот это представление 30 в виде суммы трех кубов было не известно до недавнего времени (это первое решение, которое нашли для числа 30; представимость 30 тремя кубами долго была гипотезой). Нашли, конечно, на компутере. Порядок чисел (уже кубов) - как раз примерно 30-значные. Вряд ли это делалось тупым перебором.
Вот сама программка: - 'Объява Dim M As Long Dim N As Long Dim Koeficient As Long
Private Sub Command1_Click() Dim MaxChislo As Long Dim MinChislo As Long Dim i As Long Dim strok As String 'Задаём исходные данные MinChislo = 1 MaxChislo = 100000 Koeficient = 128 For i = MinChislo To MaxChislo strok = LTrim(RTrim(Str(i))) If ProizCifr(strok) / SumCifr(strok) = Koeficient Then Print strok Else 'Print "Ни фига не найдено" End If Next i End Sub
'РАСЧЁТ СУММЫ Private Function SumCifr(Stroca As String) As Long Dim i As Long Dim Summa As Long Dim Cifra As Long For i = 1 To Len(Stroca) Cifra = Val(Mid(Stroca, i, 1)) Summa = Summa + Cifra Next i SumCifr = Summa End Function
'РАСЧЁТ ПРОИЗВЕДЕНИЯ Private Function ProizCifr(Stroca As String) As Long Dim i As Long Dim Proiz As Long Dim Cifra As Long Proiz = 1 For i = 1 To Len(Stroca) Cifra = Val(Mid(Stroca, i, 1)) Proiz = Proiz * Cifra Next i ProizCifr = Proiz End Function
Ни фига себе.. А вот как выглядит алгоритм на perl:
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Вариантов нет. Для 30 знаков нужно как-то эффективно ограничивать перебор.
Рекурсию, наверно, бесполезно (если число знаков больше 10).
Да, согласен. Начал писать и сразу понял, что long переполнится просто.
// а вот со стеком особых проблем не ожидается на уровне 30 (и даже 300) цифирей - памяти нынче большие
Да и не нужна рекурсия, можно проще, уже нашёл итеративный (в одном цикле) способ, но.. разрядности на произведение всё-равно не хватит.
Да, согласен. Начал писать и сразу понял, что long переполнится просто.
Да и не нужна рекурсия, можно проще, уже нашёл итеративный (в одном цикле) способ, но.. разрядности на произведение всё-равно не хватит.
Long нужно на String менять, как бы глупо это не звучало.
Long нужно на String менять, как бы глупо это не звучало.
да звучит не шибко глупо, просто умножения-сложения придётся ручками переписывать.
Это не страшно, но скорость уйдёт в песок, и для 30-разрядных чисел считать будет доо00000оолго.
// Правда на мкл5 всё равно на порядок-другой быстрей чем на васике :-Р
Каждое число - массив или строка цифирей. Увеличение числа - ручками моделировать.
Да все равно долго, коллайдер быстрее сработает :)
Например понятно, что нужно искать просто наборы цифирей, а то что эти числа поставленные в ряд могут образовать какое-то число для самой задачи вообще не существенно.
Далее - если сумма чисел является простым числом - пропускаем.
И т.п.
А при чем тут лонг? Тут же исключительно с цифирями работа. Ну да, понимаю, хоцца все в один цикл всунуть. Дык попробуй-ка 17-ю цифру слева у 30-разрядного числа быстро извлечь.
Лонг при том, что произведение 30 чисел в среднем равных 5 == 5^30
// ~ == 9,31323E+20 (а в лонге умещается максимум 15 десятичных разрядов)
;)
Вожусь немножко с №226.
Вьехал, что точки лежат не только на окружностях с центром в точке == центру многоугольника,
но и на наборе окружностей "половинного" диаметра прижатых к краям 1976-угольника.
Это легко понять, если представить себе место середин точек всех хорд пересекающих окружность одним из своих концов в фиксированной точке.
Возможно на этих окружностях лежат ещё какие-то "полуточки". (с) Т.е. ответ будет возможно больше чем очевидный минимум (1976).
Думаю дальше.
// Кстати, 1976 == 2*2*2*13*19
// Не знаю поможет ли это делу. Но во внимание принимаю. :)
Вот это представление 30 в виде суммы трех кубов было не известно до недавнего времени (это первое решение, которое нашли для числа 30; представимость 30 тремя кубами долго была гипотезой). Нашли, конечно, на компутере. Порядок чисел (уже кубов) - как раз примерно 30-значные.
Вряд ли это делалось тупым перебором.
Вот сама программка:
-
'Объява
Dim M As Long
Dim N As Long
Dim Koeficient As Long
Private Sub Command1_Click()
Dim MaxChislo As Long
Dim MinChislo As Long
Dim i As Long
Dim strok As String
'Задаём исходные данные
MinChislo = 1
MaxChislo = 100000
Koeficient = 128
For i = MinChislo To MaxChislo
strok = LTrim(RTrim(Str(i)))
If ProizCifr(strok) / SumCifr(strok) = Koeficient Then
Print strok
Else
'Print "Ни фига не найдено"
End If
Next i
End Sub
'РАСЧЁТ СУММЫ
Private Function SumCifr(Stroca As String) As Long
Dim i As Long
Dim Summa As Long
Dim Cifra As Long
For i = 1 To Len(Stroca)
Cifra = Val(Mid(Stroca, i, 1))
Summa = Summa + Cifra
Next i
SumCifr = Summa
End Function
'РАСЧЁТ ПРОИЗВЕДЕНИЯ
Private Function ProizCifr(Stroca As String) As Long
Dim i As Long
Dim Proiz As Long
Dim Cifra As Long
Proiz = 1
For i = 1 To Len(Stroca)
Cifra = Val(Mid(Stroca, i, 1))
Proiz = Proiz * Cifra
Next i
ProizCifr = Proiz
End Function
Ни фига себе..
А вот как выглядит алгоритм на perl:
for(111..999){
split(//,$_);
my($sum,$mul)=(0,1);
for(@_){$sum+=$_;$mul*=$_;}
print("$_\n") if($sum*12==$mul);
}
Ни фига себе..
А вот как выглядит алгоритм на perl:
.....
Да он просто программист.... так себе.
Я и на васике могу в четыре-пять строк уложиться
:)