Mathemat>>: А при чем тут лонг? Тут же исключительно с цифирями работа. Ну да, понимаю, хоцца все в один цикл всунуть. Дык попробуй-ка 17-ю цифру слева у 30-разрядного числа быстро извлечь.
MetaDriver>>: Вожусь немножко с №226. Вьехал, что точки лежат не только на окружностях с центром в точке == центру многоугольника, но и на наборе окружностей "половинного" диаметра прижатых к краям 1976-угольника. Это легко понять, если представить себе место середин точек всех хорд пересекающих окружность одним из своих концов в фиксированной точке. Возможно на этих окружностях лежат ещё какие-то "полуточки". (с) Т.е. ответ будет возможно больше чем очевидный минимум (1976). Думаю дальше. // Кстати, 1976 == 2*2*2*13*19 // Не знаю поможет ли это делу. Но во внимание принимаю. :)
Вот сама программка: - 'Объява 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
Вариантов нет. Для 30 знаков нужно как-то эффективно ограничивать перебор.
Рекурсию, наверно, бесполезно (если число знаков больше 10).
是的,我同意。开始写的时候,马上意识到,长的会直接溢出来。
// 但我不指望堆栈在30(甚至300)位时有任何问题。
我已经找到了一个迭代(在一个循环中)的方法,但是......反正产品的比特大小是不够的。
是的,我同意。我开始写作,并立即明白,长的会直接溢出来。
而且你不需要递归,它可以更简单,我已经找到了一个迭代(在一个循环中)的方法,但是......反正每个产品的位深度是不够的。
Long应该改成String,虽然听起来很傻。
Long нужно на String менять, как бы глупо это не звучало.
这听起来并不太愚蠢,只是乘法和加法要用手重写。
这很好,但速度会在沙子里走,对于30位数的数字,它需要很长的时间来计数。
// 是的,在mcl5上比在Wasik上还是要快一两个等级。
每个数字都是一个数组或一串数字。增加一个数字是一项手工建模的任务。
这仍然是一个很长的时间,对撞机将工作得更快 :)
例如,很明显,我们需要搜索的只是数字的集合,而这些数字放在一排可以形成一些数字的问题并不重要。
更进一步--如果数字的总和是一个素数--则跳过。
以此类推。
А при чем тут лонг? Тут же исключительно с цифирями работа. Ну да, понимаю, хоцца все в один цикл всунуть. Дык попробуй-ка 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:
.....
他只是一个程序员....一般般。
我可以在Wasik中用四或五行来做。
:)