Язык Си в примерах/Треугольник Паскаля: различия между версиями

Содержимое удалено Содержимое добавлено
м дополнение
Переоформлены примеры кода (включая $ indent -gnu -br); использован шаблон {{BookCat}} (была: явная категория); удалены лишние пустые строки.
Строка 23:
 
Эти числа возникают в задаче о числе сочетаний: <math>C_n^k\,\!</math> — это число способов выбрать ''k'' элементов из ''n'' различных. Например, число байт, в которых ровно 3 единицы — это число <math>C_8^3\,\!</math> — число способов выбрать три бита, в которых будут стоять единицы, из восьми бит байта.
 
 
 
Докажите, что
<math>C_n^1=n,\quad C_n^k+C_n^{k+1} = C_{n+1}^{k+1}, \quad C_n^k = \frac{n!}{k! (n-k)!}.\,\!</math>
 
 
Рассмотрим две программы, которые решают следующие задачи:
# Запрограммировать функцию <math>C(n,k) = C_n^k\,\!</math>.
# Вывести на экран ''n'' строчек треугольника Паскаля.
 
 
<source lang="c">
/*
Вычисление биномиальных коэффициентов.
*/
#include <stdio.h>
 
long C(long n,long k) {
long
if(k == 0 || n == k) return 1;
longC C(long n, long k) {
return C(n - 1, k - 1) + C(n - 1, k);
{
}
if if(k == 0 || n == k) return 1;
int main() {
longreturn n, k1;
return scanfC ("%ld%ld"n - 1, &k - 1) + C (n - 1, &k);
}
printf ("%ld ", C(n, k));
 
return 0;
int r
}
main ()
{
long c[N]n, k;
scanf ("%ld%ld", &n, &k);
printf ("%ld ", C (n, k));
return 0;
}
</source>
 
Строка 58 ⟶ 61 :
 
<source lang="c">
/*
Вычисление n-й строки треугольника Паскаля.
*/
#include <stdio.h>
#define N 1000
 
long c[N];
int
main ()
{
long c[N];
long n, i, j;
scanf ("%ld", &n);
for for(i = 1; i <= n; i++)
c[i] = 0;
c[0] = 1;
for for(j = 1; j <= n; j++)
for for(i = j; i >= 1; i--)
c[i] = c[i - 1] + c[i];
for for(i = 0; i <= n; i++)
printf ("%ld ", c[i]);
return 0;
}
</source>
 
Строка 84 ⟶ 90 :
* Начиная с какого ''n'' самое большое число из ''n''-й строчки треугольника Паскаля не умещается в тип <code>long</code>?
 
Еще 1один вариант реализации вычисления Биномиального коэффициента из общей формулы <math>C_n^k\,\!</math> (без рекурсии):
 
Еще 1 вариант реализации вычисления Биномиального коэффициента из общей формулы <math>C_n^k\,\!</math> (без рекурсии):
 
<source lang="C">
Строка 91 ⟶ 96 :
Вычисление биномиальных коэффициентов
*/
#include <stdio.h>
#include <assert.h>
#include <stdio.h>
 
int r
intbinomial binomial(int row, int pos){
int koef=1;
{
int koef = 1;
int i;
for (i = pos + 1; i <= row; i++)
koef = koef * i;
for (i = 1; i < (row - pos + 1); i++)
koef = koef / i;
return koef;
}
 
int
main (void)
{
int row, pos;
int r = scanf ("%i%i", &row, &pos);
int r
assert (r == scanf("%i%i",&row,&pos2);
printf ("%i", binomial (row, pos));
assert(r==2);
printf("%i",binomial(row,pos));
return 0;
}
Строка 120 ⟶ 128 :
Вычисление биномиальных коэффициентов
*/
#include <stdio.h>
#include <assert.h>
#include <stdio.h>
 
int
intbinomial binomial(int row, int pos){
int koef=1;
{
int koef = 1;
int i;
if (row - pos > pos)
pos = row - pos;
for (i = pos + 1; i <= row; i++)
koef = koef * i;
for (i = 1; i < (row - pos + 1); i++)
koef = koef / i;
return koef;
}
 
int
main (void)
{
int row, pos;
int r = scanf ("%i%i", &row, &pos);
int r
assert (r == scanf("%i%i",&row,&pos2);
printf ("%i", binomial (row, pos));
assert(r==2);
printf("%i",binomial(row,pos));
return 0;
}
Строка 146 ⟶ 158 :
Стоит учитывать, что в реализованных примерах нет защиты от дурака (переполнение значения переменной).
 
{{BookCat}}
[[Категория:Язык Си в примерах|{{SUBPAGENAME}}]]