Пользователь вводит числа 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
Другие языки программирования и технологии
Напишите программу которая рассчитает значение полинома n-й степени.
для того, что бы посчитать (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 по очереди, то эта формула может быть значительно оптимизирована (не надо каждый раз по новой считать факториалы). Но это уже другая история :))
что такое (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 по очереди, то эта формула может быть значительно оптимизирована (не надо каждый раз по новой считать факториалы). Но это уже другая история :))
И в чём проблема?
$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;
}
$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);
Как я и писал в своём ответе, не вижу смысла считать каждый раз факториал по новой. Да и вообще не вижу смысла считать какие либо факториалы вообще :))
только я бы сделал так:
$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
ну а расписать как не скажу, сил нет решать задачу эту
многочлен
Алгебраическое выражение вида Anx**n + An-1x**(n-1) +…+ A1x**1 + a0, где a, n - константы (n - индекс), x - переменная; то есть полином - сумма констант, умноженных на переменную в различных степенях. Полином может интерпретироваться как функция со входным значением x.
В данном случае похоже на выражение (a+b)^n
ну а расписать как не скажу, сил нет решать задачу эту
Неизвестно Неизвестно
С Новым Годом! Успехов на форуме! Георгий
не забыл указать язык программирования?
Назар Самокишин
без разницы. Мне пример нужен
Похожие вопросы
- 1. Написать программу, которая заполняет массив целых чисел размеров 20 элементов значениями роста учащихся (случайные ч
- Напишите программу, которая находит в массиве количество элементов, равных заданному значению X .
- Напишите программу на Pascal. В цистерне N литров молока.
- Напишите программу, которая выводит на экран все делители числа N, (число N вводится с клавиатуры) абсПАСКАЛЬ ПОМОГИТЕ
- Напишите программу которая будет считать значения целых переменных
- C++ Помогите написать программу, которая выводит первые n простых чисел.
- Необходимо написать программу, которая проверяет, является ли введенная с клавиатуры матрица трехдиагональной.
- Написать программу на языке паскаль возведение числа в степень. Степень вводится с клавиатуры.
- Написать программу для нахождения максимального из n чисел Помогите пожалуйста!
- аскаль. Написать программу которая переводит число из одной системы счисления в другую
$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);