[Архив!] Чистая математика, физика, химия и т.п.: задачки для тренировки мозгов, никак не связанные с торговлей - страница 321

 
Mathemat >>:

Вариантов нет. Для 30 знаков нужно как-то эффективно ограничивать перебор.

Рекурсию, наверно, бесполезно (если число знаков больше 10).

Да, согласен. Начал писать и сразу понял, что long переполнится просто.

// а вот со стеком особых проблем не ожидается на уровне 30 (и даже 300) цифирей - памяти нынче большие

Да и не нужна рекурсия, можно проще, уже нашёл итеративный (в одном цикле) способ, но.. разрядности на произведение всё-равно не хватит.

 
MetaDriver писал(а) >>

Да, согласен. Начал писать и сразу понял, что long переполнится просто.

Да и не нужна рекурсия, можно проще, уже нашёл итеративный (в одном цикле) способ, но.. разрядности на произведение всё-равно не хватит.


Long нужно на String менять, как бы глупо это не звучало.

 
Richie >>:


Long нужно на String менять, как бы глупо это не звучало.

да звучит не шибко глупо, просто умножения-сложения придётся ручками переписывать.

Это не страшно, но скорость уйдёт в песок, и для 30-разрядных чисел считать будет доо00000оолго.

// Правда на мкл5 всё равно на порядок-другой быстрей чем на васике :-Р

 
А при чем тут лонг? Тут же исключительно с цифирями работа. Ну да, понимаю, хоцца все в один цикл всунуть. Дык попробуй-ка 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-значные.
Вряд ли это делалось тупым перебором.
 
Richie >>:

Вот сама программка:
-
'Объява
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);
}

 
admin >>:

Ни фига себе..
А вот как выглядит алгоритм на perl:

.....


Да он просто программист.... так себе.

Я и на васике могу в четыре-пять строк уложиться

:)