Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2017, 14:38   #1
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию Функции. массив M, элементы которого mi = Cn i

Сформировать массив M, элементы которого mi = Cn i , где:
Cn i = n! / i! (n - i)! , n = 20; i = 1,2,…, 5

Поправьте пожалуйста. Нужно сделать без рекурсии вычисление факториала. И я так думаю, что раз здесь меняется только i, то в массиве будет 5 элементов. Подскажите как правильно
Код:
#include <stdio.h>
 
int fact(int N)
{
    if(N < 0)  return 0; 
    if (N == 0)  return 1;
    else   return N * fact(N - 1);
}
 
int func(int n, int i)
{
    return fact(n)/fact(i)*fact(n-i);
}
 
void inMas(int *mas, int size, int n)
{
    for(int i = 0; i<size; i++)
        mas[i] = func(n, i);
}
 
void printMas(int *mas, int size)
{
    for(int i = 0; i<size; i++)
        printf("%d ", mas[i]);
}
 
int main(void)
{
    int mas[20], n = 20;
    inMas(mas, 20, n);
    printMas(mas, 20);
    
    return 0;
}
KariLex вне форума Ответить с цитированием
Старый 19.05.2017, 14:57   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

длины int не хватит, чтобы хранить факториал N, если N=20


Цитата:
Сообщение от KariLex Посмотреть сообщение
Нужно сделать без рекурсии вычисление факториала
это проще простого:
Код:
int fact(int N)
{
    int result = 1;
    for(int i=2;i<=N;i++)
       result *= i;
    return result;
}

Цитата:
Сообщение от KariLex Посмотреть сообщение
Cn i = n! / i! (n - i)!
думаю, что тут лучше сразу сократить n! и (n-i)!
например, при N=20 и i=5 получается формула
Cn i = C20 5 = 16*17*18*19*20 / 5!

Последний раз редактировалось Serge_Bliznykov; 19.05.2017 в 15:00.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.05.2017, 15:25   #3
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

Я вот так сделала и у меня получается, что если n=5, то в принципе массив считает все правильно (если от i=0, то условие i=1..5 не выполняется, потому что i максимум 4), а если 20 ставлю, то печатает три нуля, а потом два отрицательных числа. Может быть вы увидите ошибку :С
Код:
#include <stdio.h>
#include <conio.h>
const int n = 20;
const int size = 5;
unsigned int fact(unsigned int n)
/*{
	if (n == 0 || n == 1) return 1;
	return n * factorial(n - 1);
}*/
{
	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[5],int size, unsigned int n)
{
	for (int i = 0; i<size; i++)
		mas[i] = func(n, i);
}

void printarray(int mas[5], int size)
{
	for (int i = 0; i<size; i++)
		printf("%d ", mas[i]);
}

int main()
{
	//int i = 3;
	int mas[5];
	array(mas, size, n);
	printarray(mas,size);
return 0;
}
KariLex вне форума Ответить с цитированием
Старый 19.05.2017, 15:31   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от KariLex Посмотреть сообщение
, а если 20 ставлю, то печатает три нуля, а потом два отрицательных числа
Вы зря не читаете, то, что я пишу.
я не буду ещё раз повторять то, что я написал выше (см. #2)

p.s. ну и ещё, ошибка в реализации формулы:
Цитата:
Сообщение от KariLex Посмотреть сообщение
Код:
return fact(n) / fact(i)*fact(n - i);
по формуле должно быть
Код:
return fact(n) / ( fact(i)*fact(n - i) );
но это Вам не сильно поможет.
о причинах - см. #2

Последний раз редактировалось Serge_Bliznykov; 19.05.2017 в 15:34.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.05.2017, 15:33   #5
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вы зря не читаете, то, что я пишу.
я не буду ещё раз повторять то, что я написал выше (см. #2)
Я прочитала это, так проще, вы правы. Но задание дали именно с формулой, не упрощая ее, сделать ВСЁ

И доп скобок тоже нет

Последний раз редактировалось KariLex; 19.05.2017 в 15:35.
KariLex вне форума Ответить с цитированием
Старый 19.05.2017, 15:36   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от KariLex Посмотреть сообщение
не упрощая ее, сделать ВСЁ
типа данных не хватает, чтобы вместить N! при N=20

Вы просто посчитайте, сколько будет fact(20) в вашей программе.
думаю, что вопросы отпадут.

p.s. обратите внимание, я выше дописал, что помимо переполнения данных, Вы ещё саму формулу неверно записали.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Pascal]: Дан массив. Построить новый массив, элементы которого - квадраты положительных элементов исходного массива и кубы отрицательных. newsnew Паскаль, Turbo Pascal, PascalABC.NET 1 21.12.2016 04:03
Дан массив размером n&#215;n, элементы которого целые числа Vaaaaaas C# (си шарп) 0 13.01.2015 20:40
Дан массив размера N, все элементы которого, кроме последнего, упорядочены по возрастанию. Сделать массив упорядоченным. nadyaH Помощь студентам 31 26.03.2014 11:15
Найти одномерный массив элементы которого равны минимальным значениям в строках исходной матрицы и одномерный массив элементы... Richik123 Microsoft Office Excel 1 16.10.2013 15:45