Треугольник паскаля, смысл строчки - C (СИ)
Формулировка задачи:
Доброго времени суток!
Не очень ясна эта строчка кода, объясните пожалуйста более развернуто.
И кстати, пытался вывести 21 строку треугольника, но он выдает отрицательные числа.
1 -1 -17 -110 -497 -1692 -4513 -9671 -16924 -24446 -29335 -29335 -24446 -16924
а должен:
1 21 210 1330 5985 20349 54264 116280 203490
return !x ? 1 : (long long)(x*fact(x - 1));
#include <stdio.h>
long long fact(long x) {
return !x ? 1 : (long long)(x*fact(x - 1));
}
long long C(long long n,long long k) {
return (long long)(fact(n) / (fact(n - k)*fact(k)));
}
int main() {
long long stroka, i, j;
printf("Kol-vo strochek: ");
scanf("%lld", &stroka);
printf("\n");
for (i = 0; i < stroka; i++) {
for (j = 0; j < i+1; j++)
printf("%lld ", C(i, j));
printf("\n");
}
return 0;
}Решение задачи: «Треугольник паскаля, смысл строчки»
textual
Листинг программы
long long C(long n, long k) {
if (k>n/2) k=n-k; // возьмем минимальное из k, n-k.. В силу симметричности C(n,k)=C(n,n-k)
if (k==1) return n;
if (k==0) return 1;
long long r=1;
for (int i=1; i<=k;++i) {
r*=n-k+i; // очередной множитель числителя
r/=i; // очередной множитель знаменателя
}
return r;
}
Объяснение кода листинга программы
- C(n,k) — функция, которая вычисляет число сочетаний из n элементов по k (long long).
- n — количество элементов в наборе.
- k — количество элементов, которые мы хотим выбрать из набора.
- Если k больше половины от n, то k заменяется на n-k, чтобы использовать формулу симметрии C(n,k)=C(n,n-k).
- Если k равно 1, то возвращается n.
- Если k равно 0, то возвращается 1.
- r=1 — инициализация переменной, которая будет хранить результат.
- for (int i=1; i<=k;++i) — цикл, который выполняется k раз.
- *r=n-k+i** — очередной множитель числителя, который добавляется к r.
- r/=i — очередной множитель знаменателя, который делится на r.
- Возвращается значение r.