LINUX.ORG.RU

Школа прогулена

 ,


0

1

а моск пропит))

Нужно вписать геометрическую прогрессию в диапазон (найти ее члены). Типа function(верхнее число, нижнее число, количество позиций включая верхнюю и нижнюю, коефф)

например function(125, 25, 5, 2)

Я методом виндовс калькулятора и чей то матери)) вычислил, что кусочки в конкретно в этом случае будут такие: 6.666666666666667 13.333333333333334 26.666666666666668 53.333333333333336

и позиции соответственно такие 125 118.333333333333333 104.999999999999999 78.333333333333331 24.999999999999995

Но как бы надо универсальную функцию на все случаи жизни

надо универсальную функцию на все случаи жизни

1) Реши на бумаге 2) Нарисуй код 3) Исправь баги 4) ... 5) Profit!

anonymous ()
Ответ на: комментарий от ZugDuk

Я 2 дня тока допирал, что то что мне нужно называется геометрическая прогрессия))))

ZugDuk ()

Пару минут пытался понять этот бред, так и не понял.

ЗЫ: по образованию и по профессии математик программист.

anonymous ()

Сходи в ближайшую школу и предложи школьникам 20баксов(или за сколько они там в вашей местности готовы карандаши расчехлять)

DonkeyHot ★★★★★ ()

Не вижу связи между кусочками и отрезками. Что такое коефф??? Моё решение задачки, как я её понял:

Математика:

min, max, count (>=1), n

m*k^n = min

m*k^(n+count-1) = max

---

k^(count-1) = max/min

(count-1)^ln(k) = ln(max/min)

ln(k) = 1/(count-1)*ln(max/min)

=>

k = (max/min)^(1/(count-1))

m = min/k^n

Код:

[xxxxx ~]$ php test.php
25.000000 = 11.180340 * (1.495349 ^ 2.000000)  = 25.000000
125.000000 = 11.180340 * (1.495349 ^ (2.000000 + 5.000000 - 1))  = 125.000000
25
37.383719530531
55.901699437495
83.592538122053
125
[xxxxx ~]$ cat test.php
<?php

$min = 25;
$max = 125;
$count = 5;
$n = 2;

$k = ($max / $min) ** (1 / ($count - 1));
$m = $min /($k ** $n);

printf("%f = %f * (%f ^ %f)  = %f\n", $min, $m, $k, $n, $m * ($k ** $n));
printf("%f = %f * (%f ^ (%f + %f - 1))  = %f\n", $max, $m, $k, $n, $count, $m * ($k ** ($n + $count - 1)));

for ($i = 0; $i<$count; $i++) {
    echo $min, "\n";
    $min *= $k;
}

anonymous ()
Ответ на: комментарий от anonymous

Всё правильно, ТС и не математик, и не программист - с чего бы тебе его понять?

Virtuos86 ★★★★★ ()
Ответ на: комментарий от anonymous

по образованию и по профессии математик программист.

Что - ТС? O_o

Deleted ()
Ответ на: комментарий от anonymous

Вот:

max, min, count(>=2), n

---

max

max - m

max - m - m*n

max - m - m*n - m*n^2

..

max - m*(n^(count-1) - 1)/(n-1) = min

---

m*(n^(count-1) - 1)/(n-1) = (max - min)

m = (max-min)*(n-1)/(n^(count-1) - 1)


[xxxxx ~]$ cat test.php
<?php

$min = 25;
$max = 125;
$count = 5;
$n = 2;

$m = ($max - $min)*($n-1)/($n ** ($count - 1) - 1);

for ($i=0; $i<$count; $i++) {
    echo "$max [$m]\n";
    $max -= $m;
    $m *= $n;
}

[xxxxx ~]$ php test.php
125 [6.6666666666667]
118.33333333333 [13.333333333333]
105 [26.666666666667]
78.333333333333 [53.333333333333]
25 [106.66666666667]
{/code]
anonymous ()

Задача переопределена.

P.S. Чувак, может, не надо? В мире есть много других интересных вещей...

Octagon ()

Задача не имеет решения

(если звёзды не сложатся удачно). По коэффициенту можно найти однозначное количество решений. Например, имея коэффициент «2» для диапазона «1..16», Вы никак не впишете туда сто чисел, только пять — это «1, 2, 4, 8, 16». И наоборот, для заданного количества чисел в указанных границах можно найти коэффициент. Геометрические прогрессии проходятся в 9-м классе, можно взять формулу конечного элемента прогрессии (имея начальный элемент и количество) и приравнять к конечному элементу.

Northsoft ★★ ()
Ответ на: Задача не имеет решения от Northsoft

Re: Задача не имеет решения

Например, имея коэффициент «2» для диапазона «1..16», Вы никак не впишете туда сто чисел

ААААА. Тупение распространяется. Объявляйте карантин!

anonymous ()
Ответ на: Задача не имеет решения от Northsoft

Re: Задача не имеет решения

Задача не имеет решения

То, что надо автору - имеет. Смотри пару комментариев выше. Его задача - разделить интервал, чтоб расстояния между участками составляли указанное число членов геометрической прогрессии с множителем 2 и любой подходящей начальной базой. Все, что ему было надо - формула для нахождения подходящей базы.

anonymous ()
Ответ на: Re: Задача не имеет решения от anonymous

Если есть конечный элемент прогрессии, то, имея множитель (2) и количество, можно посчитать начальный элемент. Только не факт, что он будет входить в заданный промежуток.

Northsoft ★★ ()
Ответ на: комментарий от Northsoft

Я не он, но отвечу - фокус в том, что расстояние до следующего должна быть в 2 раза больше, а не само число. :)

Чтоб неспамить, вот, до 10:

16 [0.027397260273973]
15.972602739726 [0.054794520547945]
15.917808219178 [0.10958904109589]
15.808219178082 [0.21917808219178]
15.58904109589 [0.43835616438356]
15.150684931507 [0.87671232876712]
14.27397260274 [1.7534246575342]
12.520547945205 [3.5068493150685]
9.013698630137 [7.013698630137]
2

ПО моей формуле, для любого интервала можно найти.

anonymous ()
Ответ на: Re: То есть задача вот такая? от anonymous

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

http://www.sciweavers.org/upload/Tex2Img_1502355157/render.png

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

Northsoft ★★ ()
Последнее исправление: Northsoft (всего исправлений: 2)
Ответ на: Формула протухла. =( от Northsoft

Наговнокодил сам пока тупым перебором (ибо достала эта математика, у меня по ней всегда были двойки)

function getPosArr(highPos, lowPos, posCount, kUsr) {
    if (highPos < lowPos || lowPos < 0 || !isWholeNum(posCount) || posCount <= 0 || posCount > 10 || kUsr < 1 || kUsr > 10) {
        console.log('ОШИБКА !!!!!! - НЕХ. СЛАТЬ В ФУНКЦИЮ ВСЯКИЙ БРЕД');
        return false;
    }
    if (posCount === 1) return [highPos];
    if (posCount === 2) return [highPos, lowPos];
    //до сих пор был унылый шлак, самая круть будет сечас !!!!!

    var diap = highPos - lowPos; //в эту циферку будем вписывать всю прогрессию
    var minPartCount = 2; //минимальное количество кусочков на которые поделиться циферка
    var partArr = []; //массив для увеличивающихся согласно коеффициенту кусочков

    recurs();   //искать будем перебором (ну а что делать, если забивал на школу)) )
     function recurs() {
         partArr = [diap / minPartCount]; //предполагаемый первый кусочек (сначала заведомо больший, чем нужно)
         for (var i = 0; i < posCount - 2; i++ ) {
             partArr.push(partArr[i] * kUsr); //каждый новый кусочек больше предыдущего в kUsr
         }
         var sum = arraySum(partArr); //суммируем все кусочки
         console.log("Сумма всех элементов: " + noExp(sum));
         if (sum > diap) { //если сумма кусочков НЕ равна исходной циферке
             minPartCount += 0.1;   // то вносим минимальное изменение
             recurs(); //и перебираем дальше
         } else { //если равна, то завершаем перебор
             console.log('Victory!!!');
             console.log(partArr);
         }
         return partArr;
     }


    var resultArr = [noExp(highPos)]; //начинаем готовить массивчик, который нам нужен в итоге

    for (var i = 0; i < partArr.length; i++) {
        resultArr.push(noExp(resultArr[i] - partArr[i])); //скрещиваем массивчики
    }

    return resultArr; //Вот и сказке конец ))
}


function noExp(num) { //вспомогательная функция, чтобы числа выглядели по русски, а не по математически
    var data= String(num).split(/[eE]/);
    if(data.length== 1) return data[0];

    var  z= '', sign= num<0? '-':'',
        str= data[0].replace('.', ''),
        mag= Number(data[1])+ 1;

    if(mag<0){
        z= sign + '0.';
        while(mag++) z += '0';
        return z + str.replace(/^\-/,'');
    }
    mag -= str.length;
    while(mag--) z += '0';
    return str + z;
}


console.log(getPosArr(0.00000125, 0.00000025, 5, 2.6));

Жопаскрипт работает в любом браузере (в хроме это инструменты разработчика), так что можете посмотреть как пашет.

Щас нада как то осилить то, что северный софт нарисовал, чтобы переписать нормально. Пока я чего то не въезжаю, какие буковки в его формуле соответствует моим входным данным.

Я уже понял, что в этой задаче самое сложное правильно найти тот самый первый маленький кусочек. Остальные то элементарно увеличиваются согласно коэффициенту и все.

ZugDuk ()

что такое «верхнее число» «нижнее число» в геометрической прогресии, неясно вообще...видимо я не прогуливал школу :-)

а так - любая геом.прогрессия в логарифмической шкале становится арифметической :-)

Формулируйте правильно:есть начальное число X(0), есть множитель K. прогрессия имеет вид X(n)=X(n-1)*K; Надо вычислить мин. «n» попадающий в диапазон [5..25]; аналогично максимальный

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

Та ну чего не понятно то?? Вот представь цена на монету падает, я ее хочу подобрать, но точно не знаю до кудава она доупадет. Я не юзаю весь деп в одной монете, ставлю допустим 5%, но вдруг какой ссыкливый чурбан на панике ливанет весь свой запас в хилой стакан. Цена сквизанет вниз. Она конечно отрастет на сколько то, но я один х. залечу в убыток, если у меня 1 ордер. А так мой деп стоит внизу размазанный по нескольким уровням на подстраховке. Если будет сквиз, то мне нальют и средняя норм. получится. Я потом лишнее скину и у меня будет нормальный вход в сделку, а не сразу в убыток. На а что такое размазать по уровням? Нужны эти самые уровни. Их можно от и до линейно брать, а можно с коэфф (вообще лучше по Фибоначчи это делать). Вот по этому верхняя поза, нижняя поза и количество сколько их всего, включая те, что посередине.

Формулируйте правильно:есть начальное число X(0), есть множитель K. прогрессия имеет вид X(n)=X(n-1)*K; Надо вычислить мин. «n» попадающий в диапазон [5..25]; аналогично максимальный

Ну а как вычислить этот минимальный кусочек????

ZugDuk ()
Ответ на: комментарий от ZugDuk

Забыл докинуть пару функций, без которых код выше не пашет

function arraySum(array){
    var sum = 0;
    for(var i = 0; i < array.length; i++){
        sum += array[i];
    }
    return sum;
}

function isNum(num) {
    if (!num || num === undefined || isNaN(num) || num === null || typeof num != "number" || num === Infinity || num === -Infinity) return false;
    return true;
}
ZugDuk ()
Ответ на: комментарий от ZugDuk

судя по жаргону, школа была прогулена капитально :-)

ceil(ln(5)/ln(2)) даёт первое число (сколько раз надо начальную ставку увеличивать вдвое, чтобы результат стал больше чем 5)

floor(ln(25)/ln(2)) - второе число

остаётся проверить что первое число меньше второго (что вы не проскакиваете мимо этот диапазон)

MKuznetsov ★★★★★ ()
Ответ на: комментарий от ZugDuk

Жесть какая-то.

function getPosArr(highPos, lowPos, posCount, kUsr) {
	var i;
	var q_i = 1, q_n = 1, distance = highPos - lowPos;
	var result = new Array();

	if (posCount == 1) {
		return new Array(highPos);
	} else {
		--posCount; // теперь posCount - это количество отрезков
	}

	for (i=0; i<posCount; ++i)
		q_n *= kUsr;
	
	for (i=0; i<=posCount; ++i) {
		result[result.length] = lowPos + distance * (q_i - 1) / (q_n - 1);
		q_i *= kUsr;
	}

	return result;
}
getPosArr(125, 25, 5, 2)
Array [ 25, 31.666666666666668, 45, 71.66666666666666, 125 ]
Northsoft ★★ ()
Ответ на: Жесть какая-то. от Northsoft

Да это ЭПИЧНО !!! Да прибудет с тобой сила северных земель !!! :))) https://www.youtube.com/watch?v=edBYB1VCV0k

Я тока немного подправил строчку на

result[result.length] = highPos - distance * (q_i - 1) / (q_n - 1);

чтобы выдавало то что мне нужно

ну и единички этой формуле не удаются, по этому в начале нужно добавить

if (kUsr === 1) kUsr = 1.01;

А так считает четко то, что нужно !!! Как тебе это удалось?)))

ZugDuk ()
Ответ на: комментарий от ZugDuk

Костыли-костыльчики.

Зачем 1.01? Где же ваше воображение?

function getPosArr(highPos, lowPos, posCount, kUsr) {
	var i;
	var q_i = 1, q_n = 1, distance = highPos - lowPos;
	var result = new Array();

	if (posCount == 1) {
		return new Array(highPos);
	} else {
		--posCount; // теперь posCount - это количество отрезков
	}

	if (kUsr == 1) {
		for (i = 0; i <= posCount; ++i) {
			result[result.length] = highPos - distance * i / posCount;
		}
		return result;
	}

	for (i=0; i<posCount; ++i)
		q_n *= kUsr;
	
	for (i=0; i<=posCount; ++i) {
		result[result.length] = highPos - distance * (q_i - 1) / (q_n - 1);
		q_i *= kUsr;
	}

	return result;
}
getPosArr(125, 25, 5, 2)
Array [ 125, 118.33333333333333, 105, 78.33333333333334, 25 ]
getPosArr(125, 25, 5, 1)
Array [ 125, 100, 75, 50, 25 ]

А так считает четко то, что нужно !!! Как тебе это удалось?)))

Я исходил из того, что отрезок длиной distance = highPos - lowPos делится на n = posCount - 1 отрезков, длины которых составляют геометрическую прогрессию. И полную длину отрезка я приравнял к сумме геометрической прогресси n элементов с известным коэффициентом q=kUsr, формула (1). Формула суммы геометрической прогрессии проходится в 9‑м классе. В формуле (1) неизвестным является b — первый элемент прогрессии, он может быть выражен очень просто, формула (2). Дальше, чтобы получить i‑й элемент, к началу прибавляем сумму i элементов геометрической прогрессии (или отнимаем от конца, как тебе лучше): формула (3), где len — это длины отрезков. В формулу (3) подставляем формулу суммы элементов геометрической прогрессии, получаем формулу (4). В формулу (4) можно подставить формулу (2), получится это, сокращаем и получаем ОТВЕТ!!!.

Northsoft ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.