[Архив!] Чистая математика, физика, химия и т.п.: задачки для тренировки мозгов, никак не связанные с торговлей - страница 321
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вариантов нет. Для 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:
.....
Да он просто программист.... так себе.
Я и на васике могу в четыре-пять строк уложиться
:)