Другие языки программирования и технологии

Напишите программу которая рассчитает значение полинома n-й степени.

Пользователь вводит числа a, b, n. Напишите программу которая рассчитает значение полинома n-й степени.
Пример:
Если дано a=3, b=5, n=4, программа должна вывести на экран следующее:
a^4+4*a^3*b+6*a^2*b^2+4*a*b^3+b^4=4096
для того, что бы посчитать (a+b)^n, скобки раскрывать не обязательно. Если по условию надо именно посчитать, то это действие лишнее. Если же по условию надо раскрыть скобки и вывести формулу многочлена пользователю, тогда да... Дальше будет уйма пояснений, кому не интересно, в самом конце я приведу формулу расчёта коэффициента каждого члена этого многочлена :)

что такое (a+b)^n ?
(a+b)^n = (a+b)(a+b)(a+b)....Представим, что мы хотим расписать все вариации перемножения и просуммировать их (раскрыть скобки). Тогда из каждых скобок мы будем выбирать 1 из 2 множителей.

Тогда что бы перебрать все вариации нам надо записать все возможные n-битные числа, в которых нули будут соответствовать умножению на a, а единицы - на b.

Но это пока ещё решение "в лоб" - скучно и банально. А потому идём дальше.
Нам не надо считать все возможные варианты. Нам просто надо посчитать сколько раз мы получим число со всеми нулями (соответствует a^n), потом с одной единицей (соответствует a^(n-1)*b), потом с двумя единицами и т. д. Получив эти значения мы по сути и получаем коэффициенты перед слагаемыми.

Как же нам проще всего посчитать в сколько n-битных чисел с k нулями существует?
Изменим принцип записи чисел и будем записывать не нули и единицы, а запишем k чисел, которые будут указывать на позиции нулей в нашем n-битном числе.

Теперь мы можем посчитать все вариации этих k чисел от 1 до n... это n^k :) Но это пока что далеко не всё.
Теперь нам надо исключить те варианты, в которых есть одинаковые значения (ведь мы не можем записать 2 нуля в одной ячейке).

n!/(n-k)! - такое количество вариантов можно записать с помощью k чисел от 1 до n при условии, что эти k чисел не будут повторяться. Но и это пока не всё. Представим мы хотим записать число 1101101
мы напишем 3 и 6 (позиции нулей)... но ведь его также можно записать как 6 и 3. То есть оба этих варианта являются представлением одного и того же числа. Значит нам надо исключить такие дубли.

Как мы понимаем, наши 2 числа в примере равноценны и потому мы можем поменять их местами. Исходя из этой логики, мы избежим повторений, если поделим количество найденных вариантов на количество равноценных чисел, то есть на 2 в указанном примере. Для трёх чисел ситуация равнозначна, только там 3 равноценных числа, а для каждого из них есть ещё варианты с двумя равноценными числами. То есть для трёх чисел мы должны делить на 3*2 = 6. Закономерность такова, что делить надо на k! (k факториал)

>>>>ВОТ НАША ФОРМУЛА<<<<

Итого, наша искомая формула выглядит вот так: n!/(k!*(n-k)!), где n - степень, которая дана по условию задачи, а k - порядковый номер искомого слагаемого. (не считая a^n.. у него порядковый номер 0).

Ну вот например найдём все коэффициенты для (a+b)^5 = a^5+k1*a^4*b+k2*a^3*b^2+k3*a^2*b^3+k4*a*b^4+b^5
k1 = 5!/(1!*(5-1)!) = 120/24 = 5
k2 = 5!/(2!*(5-2)!) = 120/12 = 10
k3 = 5!/(3!*(5-3)!) = 120/12 = 10
k4 = 5!/(4!*(5-4)!) = 120/24 = 5

(a+b)^5 = a^5+5*a^4*b+10*a^3*b^2+10*a^2*b^3+5*a*b^4+b^5

Кстати, если считать все k по очереди, то эта формула может быть значительно оптимизирована (не надо каждый раз по новой считать факториалы). Но это уже другая история :))
Анатолий Турков
Анатолий Турков
42 958
Лучший ответ
Анатолий Турков В комментарии на один из ответов свой код написал. Кину его ещё и сюда на всякий случай (php).

$n = 6;

$res = ['a^'.$n];
$koef = [1];

for($k=1; $k<=$n; $k++){
$koef[$k] = $koef[$k-1]*($n+1-$k)/$k;

$a = $n-$k>0 ? '*a'.($n-$k>1 ? '^'.($n-$k) : '') : '';
$b = '*b'.($k>1 ? '^'.$k : '');
$res[] = $koef[$k].$a.$b;
}
echo implode('+', $res);
И в чём проблема?

$res = [];
for($i = 0; $i <= n; ++$i) {
$tmp = [];
if ($i > 0 && $i < n) { $tmp[] = C($i, $n); }
if ($i < n - 1) { $tmp[] ='a^' . ($n-$i); } elseif ($i == n - 1) { $tmp[] = 'a'; }
if ($i > 1) { $tmp[] ='b^' . $i; } elseif ($i == 1) { $tmp[] = 'b'; }
$res[] = implode('*', $tmp);
}
echo implode('+', $res), '=', ($a + $b) ** $n;

function C($m, $n) {
return fact($n) / (fact($m) * fact($n - $m));
}

function fact($n) {
$res = 1;
for($i = $n; $i >= 2; $res *= $i--);
return $res;
}
Артем Баглай Эм... ну да :)

только я бы сделал так:
$n = 6;

$res = ['a^'.$n];
$koef = [1];

for($k=1; $k<=$n; $k++){
$koef[$k] = $koef[$k-1]*($n+1-$k)/$k;

$a = $n-$k>0 ? '*a'.($n-$k>1 ? '^'.($n-$k) : '') : '';
$b = '*b'.($k>1 ? '^'.$k : '');
$res[] = $koef[$k].$a.$b;
}
echo implode('+', $res);

Как я и писал в своём ответе, не вижу смысла считать каждый раз факториал по новой. Да и вообще не вижу смысла считать какие либо факториалы вообще :))
полином
многочлен
Алгебраическое выражение вида Anx**n + An-1x**(n-1) +…+ A1x**1 + a0, где a, n - константы (n - индекс), x - переменная; то есть полином - сумма констант, умноженных на переменную в различных степенях. Полином может интерпретироваться как функция со входным значением x.

В данном случае похоже на выражение (a+b)^n
ну а расписать как не скажу, сил нет решать задачу эту
Dima_T
Dima_T
58 704
Неизвестно Неизвестно С Новым Годом! Успехов на форуме! Георгий
не забыл указать язык программирования?
Назар Самокишин без разницы. Мне пример нужен

Похожие вопросы