Дана пооследовательность из 100 чисел, как определить связаны ли элементы этой последовательности геометрической програссией, а главное как вывести самую длинную прогрессию ?
14.03.05 18:22: Перенесено из 'C/C++'
Re: помогите чайнику
От:
Аноним
Дата:
14.03.05 12:33
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Дана пооследовательность из 100 чисел, как определить связаны ли элементы этой последовательности геометрической програссией, а главное как вывести самую длинную прогрессию ?
у геометрической прогрессии есть коэффициент:
a[i+1] = coeff*a[i], я прав?
если все 100 чисел целые, то просто перебираешь все coeff от 1 до упора(до тех пор пока a[0]*coeff <= a[99]) и для каждого coeff
проверяешь сколько чисел подряд связаны в прогрессию с коэффицентом coeff.
все результаты сохраняешь, потом выбираешь coeff с максимальным количеством элементов
приблизительно — так, это если я с тем, что такое прогрессия не наврал
Здравствуйте, Аноним, Вы писали:
А>Дана пооследовательность из 100 чисел, как определить связаны ли элементы этой последовательности геометрической програссией, а главное как вывести самую длинную прогрессию ?
А в чем проблема? Ты не знаешь что такое геометрическая прогрессия?
Здравствуйте, Аноним, Вы писали:
А>Дана пооследовательность из 100 чисел, как определить связаны ли элементы этой последовательности геометрической програссией, а главное как вывести самую длинную прогрессию ?
1) Если предполагается, что последовательность может быть перемешана — отсортировать.
2) Проверить, выполняется ли соотношение x[k]:x[k+1] == x[k+1]:x[k+2] для всех смежных пар.
3) Если предполагается, что в последовательности кроме прогрессии встречается мусор — применить статистические методы.
Например, прологарифмировать; логарифм геометрической прогрессии — это арифметическая прогрессия. Проверить, насколько последовательность похожа на прямую — большого труда не составит.
Здравствуйте, Аноним, Вы писали:
А>Дана пооследовательность из 100 чисел, как определить связаны ли элементы этой последовательности геометрической програссией,
Сначала, если последовательность не упорядочена, отсортировать ее, например, по-возрастанию.
Затем, выяснить, множитель георметрической прогрессии (или как он там правильно называется) делением второго элемента на первый.
И наконец, проверить для каждого оставшегося члена получается ли он произвдением предыдущего члена на множитель.
A>а главное как вывести самую длинную прогрессию ?
Здравствуйте, Кодт, Вы писали:
К>Проверить, насколько последовательность похожа на прямую — большого труда не составит.
да, но зачем провертяь на схожеть с прямой, если в задаче четко сказано, что нужно вывести самую длинную последовательность, удовлетворяющую гео прогресси
Здравствуйте, misha_sk, Вы писали:
_>Здравствуйте, Аноним, Вы писали:
А>>Дана пооследовательность из 100 чисел, как определить связаны ли элементы этой последовательности геометрической програссией,
Допустим есть 10 чисел
1, 3, 6, 12, ...
_>Сначала, если последовательность не упорядочена, отсортировать ее, например, по-возрастанию.
отсортировали
1, 3, 6, 12, ...
_>Затем, выяснить, множитель георметрической прогрессии (или как он там правильно называется) делением второго элемента на первый.
k = 3 / 1 = 3
_>И наконец, проверить для каждого оставшегося члена получается ли он произвдением предыдущего члена на множитель.
k = 3
6 != 3 * k, => последовательность содержит два элемента
A>>а главное как вывести самую длинную прогрессию ?
_>А что это такое ?
то, что первая последовательность содержит всего два числа 1 и 3 где k = 3
потом идет вторая последовательность 3, 6, 12 где k = 2
поэтому самая длинная будет последовательность 3, 6, 12
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Аноним, Вы писали:
А>>Дана пооследовательность из 100 чисел, как определить связаны ли элементы этой последовательности геометрической програссией, а главное как вывести самую длинную прогрессию ?
К>1) Если предполагается, что последовательность может быть перемешана — отсортировать.
Здравствуйте, ssm, Вы писали:
ssm>уже ошибка. вот проверь:
Можно сделать иначе:
1. сортируем по абсолютной величине, и, если знаменатель не +/- 1, отсееваем совпадающие элементы;
2. лабаем функцию по алгоритму:
а) пусть дана последовательность b_1, ..., b_n, и знаменатель q, тогда, если выполняется условие b_n = q^(n-1)*b_1, выполняем операцию (а) для подпоследовательности b_2, ..., b_n-1, увеличивая длину прогресси на 2, если условеие не выполняется, то выполняем (а) последовательно для b_1, ..., b_n-1, а за тем для b_2, ..., b_n, выбирая максимум из длин соответствующих подпоследовательностей.
3. найдя таким образом знаменатель(и максимальную длину прогресси), можно попробовать вывести эту самую прогрессию. 8)
Здравствуйте, Аноним, Вы писали:
А>у геометрической прогрессии есть коэффициент: А>a[i+1] = coeff*a[i], я прав? А>если все 100 чисел целые, то просто перебираешь все coeff от 1 до упора(до тех пор пока a[0]*coeff <= a[99]) и для каждого coeff А>проверяешь сколько чисел подряд связаны в прогрессию с коэффицентом coeff. А>все результаты сохраняешь, потом выбираешь coeff с максимальным количеством элементов
Проще отсортировать прогрессию по возрастанию, а потом делить числа на предыдущие, начиная с большего. Как только результат деления отличается от предыдущего результата деления, значит текущая прогрессия закончилась, началась следующая.
G>Проще отсортировать прогрессию по возрастанию, а потом делить числа на предыдущие, начиная с большего. Как только результат деления отличается от предыдущего результата деления, значит текущая прогрессия закончилась, началась следующая.
Здравствуйте, unforgiven_hero, Вы писали:
_>Здравствуйте, ssm, Вы писали:
ssm>>уже ошибка. вот проверь: _>)
_>Можно сделать иначе: _>1. сортируем по абсолютной величине, и, если знаменатель не +/- 1, отсееваем совпадающие элементы; _>2. лабаем функцию по алгоритму: _>а) пусть дана последовательность b_1, ..., b_n, и знаменатель q, тогда, если выполняется условие b_n = q^(n-1)*b_1,
опять знак теряется при отрицательном коэфициенте и нечетном n!!!
2, -4, 8, -16, 4
какую 4-ку будешь отсеивать ?
проше всего последовательность не сортировать а предположить, что последовательность уже правильно отсортированна
А такой случай никто даже близко не рассматривает. Вроде условия что элементы прогресси располагаются по порядку не было. А если в последовательности может быть мусор, тогда тем более нельзя искать последовательность как неразрывную.
Здравствуйте, ssm, Вы писали:
ssm>опять знак теряется при отрицательном коэфициенте и нечетном n!!!
ну, дык, надо же пралльно корни извлекать, т.е. я имею в виду, то, что при нечетном n, и четном (n-1) надо проверять два случая с q = +/- sqr(b_n/b_1, n-1). Я думаю, что это уже не принципиально! 8)
ssm>2, -4, 8, -16, 4 ssm>какую 4-ку будешь отсеивать ?
ту(те), которая(ые) не удовлетворяет(ют) знакочередованию последовательности!
так, например, {2, -4, 8, -16, 32} ((n = 5)%2 != 0 && (q = -2) < 0)
будет выполнятся следующим образом:
так как уже не надо ничего сортировать, просто запускаем алгоритм.
вычисляем начальное значение q: q^(n-1)*b_1 = b_n => q^4*2 = 32 => q = +/- 2; от и усе, вроде... хех, аль нет?
ssm>проше всего последовательность не сортировать а предположить, что последовательность уже правильно отсортированна
Здравствуйте, Аноним, Вы писали всякое, но я попрошу:
Пожалуйста, конкретизируй формулировку своей проблемы, подробнее распиши, а то тут народ из-за "расплывчатого" условия...
Я прочитал несколько раз — не совсем понял некоторорые детали.
Здравствуйте, unforgiven_hero, Вы писали:
_>так, например, {2, -4, 8, -16, 32} ((n = 5)%2 != 0 && (q = -2) < 0) _>будет выполнятся следующим образом: _>так как уже не надо ничего сортировать, просто запускаем алгоритм. _>вычисляем начальное значение q: q^(n-1)*b_1 = b_n => q^4*2 = 32 => q = +/- 2; от и усе, вроде... хех, аль нет?
я плохо чета после работы соображаю
но вот пока я трясся в дойче-бане по дороге домой, пришел на ум следующий вариант:
сам алгоритм можно в 10 строчках уместить.
выводит все геометрические прогресии, отсортированные по количеству элементов ней.
первая естественно — самая жирная:
Здравствуйте, Аноним, Вы писали:
А>Дана пооследовательность из 100 чисел, как определить связаны ли элементы этой последовательности геометрической програссией, а главное как вывести самую длинную прогрессию ?
to ssm: 4, 10, 25, ... — Сечешь?
to Author:
Пару уточнений:
1. В задаче не сказано, может ли быть так, что числа последовательности будут дробными; 8)
2. Но тем более, необходимо ли учитывать факт целочисленности знаменателя!
вообщем, вот...
typedef unsigned int uint;
const uint N = 11;
void main()
{
float Seq[N] = {1, 2, 4, 8, 16, 32, 64, 256, 1024, 4096, 16384};
//float Seq[N] = {1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1}; // тута глючит, ну и х.. :D
float MaxB, MaxQ, MaxN = 0, k; // пояснять названия переменных не имеет значения 8)
for(uint b = 0; b < N; b++)
for(uint q = 0; q < N; q++)
if(q != b && (Seq[q]/Seq[b] > 1.0f || Seq[q]/Seq[b] < -1.0f))
{
k = Seq[b];
for(uint n = 2; true; n++)
{
k *= Seq[q]/Seq[b];
for(uint i = 0; i < N; i++)
if(q != i && Seq[i]/k == Seq[q]/Seq[b])
break;
if(i == N)
break;
}
if(n >= MaxN)
{
MaxN = n;
MaxQ = Seq[q]/(MaxB = Seq[b]);
}
}
}