2013-06-21 2 views
-2

Я была поставлена ​​задача, чтобы решить эту проблему:Алгоритм биномиального коэффициента (Ncr) в Рубине

Есть ровно десять способов выбора трех из пяти, 12345:

123, 124, 125, 134, 135, 145, 234, 235, 245, and 345 

В комбинатонике мы используем обозначение, 5C3 = 10. В общем,

nCr = n!/r!(n−r)! 

где r ≤ n, n! = n×(n−1)×...×3×2×1 и 0! = 1.

Только до n = 23, что значение превышает один миллион: 23C10 = 1144066.

Сколько, не обязательно отличных значений, nCr, для 1 ≤ n ≤ 100, - больше одного миллиона?

Мне нужно разработать алгоритм в Ruby для решения этой проблемы, но я, похоже, не понимаю, как это делается.

+0

ли это быть "умный" алгоритм? Если нет, вы всегда можете просто решить для всех и подсчитать количество выпущенных решений, превышающих один миллион. –

+0

Неясно, что вы подразумеваете под 'Только до n = 23, что значение превышает один миллион: 23C10 = 1144066.'. Откуда «10»? Вы имеете в виду 'for some r'? Если это так, вам нужно написать это. – sawa

+0

@sawa На самом деле его копирование с актуальной страницы проблемы: http://projecteuler.net/problem=53 –

ответ

2

Это проблема Эйлера проекта. Чтобы решить эту проблему, вам необходимо применить треугольник паскаля. Треугольник pascal симметричен, поэтому нам нужно вычислить половину его, чтобы получить результат, это заставит вашу программу работать быстрее.

Другой способ кэширования ранее вычисленных факториальных результатов и использовать их во избежание излишней перегрузки вычислений.

@@fact_table = [] 
@@fact_table[0] = 1; 
@@fact_table[1] = 1; 

for i in (2..100) 
    @@fact_table[i] = i * @@fact_table[i-1] 
end 

def ncr(n, r) 
return @@fact_table[n]/(@@fact_table[r] * @@fact_table[n-r]) 
end 

num = 0 
for n in (1..100) 
    for r in (1..n) 
    if ncr(n, r) > 1000000 
     num += 1 
    end 
    end 
end 

print "Count exceeding 1 million: ", num, "\n" 

Выход

Count exceeding 1 million: 4075