Язык Си в примерах/Треугольник Паскаля: различия между версиями
Содержимое удалено Содержимое добавлено
Karagota (обсуждение | вклад) мНет описания правки |
Greck (обсуждение | вклад) мНет описания правки |
||
Строка 1:
{{Содержание «Язык Си в примерах»}}
Всем известны простые формулы
* <math>(a+b)^2 = a^2 + 2ab + b^2</math>
* <math>(a+b)^3 = a^3 + 3a^2b + 3ab^2 + b^3</math>
А как находить коэффициенты в разложении <math>(a+b)^n</math>?
Рассмотрим следующую таблицу:
[[Изображение:pascal.png]]
Строка 8 ⟶ 14 :
этого треугольника находятся коэффициенты для разложения <math>(a+b)^n\,\!</math>.
Число номер <math>k+1</math> в <i>n</i>-
Например,
<math>
Стороны треугольника Паскаля состоят из единичек. Каждое число внутри треугольника Паскаля равно сумме двух чисел, стоящих над ним справа и слева в предыдущей строчке:
<math>C^{k+1}_{n+1} = C^{k+1}_{n}+C^k_{n}.</math>
Эти числа возникают в задаче о числе сочетаний: <math>
число способов быбрать ''k'' элементов из ''n'' различных. Например,
чиcло байт, в которых ровно 3 единицы — это число <math>
число способов выбрать три бита, в которых будут стоять единицы,
из
Докажите, что
<math>
Рассмотрим две программы,
# Запрограммировать функцию <math>C(n,k) =
# Вывести на экран <i>n</i> строчек треугольника Паскаля.
Строка 36 ⟶ 44 :
*/
#include <stdio.h>
long C(long n,long k) {
if(k == 0 || n == k) return 1;
return C(n - 1, k - 1) + C(n - 1, k);
}
int main() {
long n, k;
scanf ("%ld%ld", &n, &k);
Строка 50 ⟶ 56 :
* Сколько раз вызовется функция C(., .) при вычислении С(n, k)?
* Докажите, что время вычисления <math>
* Оцените ассимптотику <math>
Строка 61 ⟶ 67 :
#define N 1000
long c[N];
int main () {
long n, i, j;
scanf ("%ld",&n);
Строка 76 ⟶ 81 :
*Докажите, что указанный алгоритм вычисления
работает быстрее, чем алгоритм вычисления <math>C''n^k\,\!</math> из предыдущей программы, а именно
время работы пропорционально <math>n^2\,\!</math>.
*Начиная с какого ''n'' самое большой число из
|