Треугольник паскаля, смысл строчки - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д