Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Сформировать массив M, элементы которого mi = Cn i


Автор: Elaysa 20.5.2017, 18:17
Сформировать массив M, элементы которого mi = Cn i , где:
Cn i = n! / i! (n - i)! , n = 20; i = 1,2,…, 5 
Помогите пожалуйста. при !20 типа уже не хватает, а как сделать, чтобы работало???
Код

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
const int n = 20;
const int size = 6;
 
unsigned int fact(unsigned int n)
{   int r;
    for (r = 1; n > 1; r *= (n--));
    return r;
}
 
int func(unsigned int n, int i)
{// for (i=1;i<=size;i++)   
    return fact(n) / (fact(i)*fact(n - i));
    }
void array(int mas[size],int size, unsigned int n)
{   for (int i = 0; i<size; i++)
        mas[i] = func(n, i);
}
 
void printarray(int mas[size], int size)
{   for (int i = 0; i<size; i++)
        printf("%d ", mas[i]);
}
 
int main()
{
    //int i = 3;
    int mas[size];
    array(mas, size, n);
    printarray(mas,size);
 
    return 0;
}

Автор: feodorv 20.5.2017, 20:23
Цитата(Elaysa @  20.5.2017,  18:17 Найти цитируемый пост)
Помогите пожалуйста. при !20 типа уже не хватает, а как сделать, чтобы работало???

Можно использовать 64-битные переменные (long long или __int64), 64 бита должно хватить на 23!

Можно более хитро вычислять C(n,i). Например:
Код
#include <stdio.h>

int getC( int n, int i)
{
  int C = 1, k;

  if( i < n - i ) i = n - i;

  for( k = n; k > i; --k)
  {
    C *= k;
    C /= (n-k+1);
  }

  return C;
}

int main( void )
{
  int i, n;

  for( n = 0; n <= 20; ++n)
  {
    printf( "%d", getC( n, 0));
    for( i = 1; i <= n; ++i) printf( " %d", getC( n, i));
    printf( "\n" );
  }

  return 0;
}


Или так:
Код
#include <stdio.h>

int C[21][22]; // Изначально нулевые значения, это важно!!!

int main( void )
{
  int i, n;

  for( n = 0; n <= 20; ++n)
  {
    C[n][0] = 1;
    for( i = 1; i <= n; ++i) C[n][i] = C[n-1][i-1] + C[n-1][i];
  }

  for( n = 0; n <= 20; ++n)
  {
    printf( "%d", C[n][0]);
    for( i = 1; i <= n; ++i) printf( " %d", C[n][i]);
    printf( "\n" );
  }

  return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)