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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2011, 21:45   #1
decantnik
Пользователь
 
Аватар для decantnik
 
Регистрация: 15.10.2008
Сообщений: 36
По умолчанию C - Задача из комбинаторики

Доброе время суток.
Получил по лабе вот такую задачу:

Цитата:
Определить количество чисел состоящих из n десятичных разрядов (N - натуральное число, вводится пользователем, N <= 10) у которых в двоичном представлении количество разрядов, установленных в «1», равняется числу K (натуральное число, вводится пользователем, K < log2N + 1). Учитывать, что число может начинаться с нулей: 0042342.
Препод сказал только пару слов "ищи информацию по комбинаторики"

Помогите кто-нибудь разобраться с условием
decantnik вне форума Ответить с цитированием
Старый 24.10.2011, 21:59   #2
Lasur
Форумчанин
 
Аватар для Lasur
 
Регистрация: 13.10.2011
Сообщений: 143
По умолчанию

1) Определить сколько двоичных разрядов у такого числа. Их примерно (int)log2(N)+1. Обозначим M.
2) Тогда кол-во всех возможных чисел с K единицами из такого кол-ва разрядов с учетом порядка равно A(M, k) = M!/(M-k)!
Где x! - факториал числа x.
Все имена, фамилии, ники, даты и события упоминаемые в моих постах, являются вымышленными. Все совпадения с реально существующими - случайны.
Lasur вне форума Ответить с цитированием
Старый 24.10.2011, 22:14   #3
decantnik
Пользователь
 
Аватар для decantnik
 
Регистрация: 15.10.2008
Сообщений: 36
По умолчанию

Спасибо большое!!
decantnik вне форума Ответить с цитированием
Старый 24.10.2011, 22:25   #4
Lasur
Форумчанин
 
Аватар для Lasur
 
Регистрация: 13.10.2011
Сообщений: 143
По умолчанию

Вот детали, если интересно.
Все имена, фамилии, ники, даты и события упоминаемые в моих постах, являются вымышленными. Все совпадения с реально существующими - случайны.
Lasur вне форума Ответить с цитированием
Старый 24.10.2011, 22:46   #5
decantnik
Пользователь
 
Аватар для decantnik
 
Регистрация: 15.10.2008
Сообщений: 36
По умолчанию

Вот решение, так сказать для истории:

Код:
#include <stdio.h>
#include <math.h>


double fact (int chislo);

int main(int argc, char *argv[])
{   
	int n,k;
    printf ("N = ");
	scanf ("%d", &n);
    printf ("K = ");
    scanf ("%d", &k);
	int m,a;
    m  = log2(n)+1;  //находим кол. двоичных разрядов
    a = fact(m)/(fact(m-k)); //кол-во всех возможных чисел с K единицами из такого кол-ва разрядов с учетом порядка
    printf("%d\n", m);
    return 0;
}

double fact (int chislo)
	{
double z=1;
for (int i=1;i<=chislo;i++)
	z*=i;
				
return(z);	
	}
decantnik вне форума Ответить с цитированием
Старый 24.10.2011, 22:53   #6
Lasur
Форумчанин
 
Аватар для Lasur
 
Регистрация: 13.10.2011
Сообщений: 143
По умолчанию

Не обязательно писать факториал, это несколько замедлит код, так как и в произведении знаменателя, и в произведении числителя вы считаете некоторые числа по несколько раз. Достаточно в цикле for посчитать a=(m)*(m-1)*(m-2)*......*(m-k+1), тогда лишних произведений не будет.
Все имена, фамилии, ники, даты и события упоминаемые в моих постах, являются вымышленными. Все совпадения с реально существующими - случайны.
Lasur вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51
Задача на Си Buddy Помощь студентам 1 19.01.2011 02:41
Задача Stydent777 Помощь студентам 2 16.01.2011 23:37
задача Кубик-Рубик Помощь студентам 2 15.01.2011 16:03