15
Январь
2011
Найти геометрическую прогрессию
Найти геометрическую прогрессию
Входные данные:
N, T,
a1, a2, a3 …. aN
Найти в массиве подряд идущие элементы, которые образуют геометрическую прогрессию с наибольшим знаменателем (по модулю), количество членов которой не меньше T за линейное время.
Если нет ни одной последовательности, длиной T – выдать 0.
Если найдена – выдать:
№ первого элемента последовательности, Знаменатель, Длину последовательности
Const str = "0 4 0 1 16 32 64 12 1 1 1" Const T = 3 Dim V As Variant, N# Dim MaxQ#, MaxL#, MaxI# Dim TempL#, TempI# Dim prevQ#, nowQ#, i Private Sub Form_Load() On Error Resume Next V = Split(str, " ") N = UBound(V) prevQ = -1 For i = 1 To N nowQ = V(i) / V(i - 1) If prevQ <> Abs(nowQ) Then iNtrue Else If prevQ = Abs(nowQ) Then TempL = TempL + 1 End If End If If i = N Then iNtrue prevQ = Abs(nowQ) Next If MaxQ = 0 Then Print "0" Else Print "Number of the first element: " & MaxI & vbCrLf & "Denominator: " & MaxQ & vbCrLf & "Sequence length: " & MaxL End If End Sub Sub iNtrue() If TempL >= T Then If MaxQ < Abs(prevQ) Then MaxQ = Abs(prevQ) MaxL = TempL MaxI = TempI End If If i = N And MaxQ < Abs(nowQ) Then MaxQ = Abs(nowQ) MaxL = TempL MaxI = TempI End If End If TempI = i TempL = 2 End Sub