我想为这种数学问题找到最快速的解决方案:
假设房间里有5个人。每个人都必须握手 彼此。它带来了多少种组合?
虽然我知道组合公式
我使用这个快速的阶乘函数:
func factorial(n: Int) -> Int {
return n == 0 ? 1 : n * factorial(n — 1)
}
有没有办法建立一个函数,它不仅仅通过替换上面公式中的变量来计算组合?
注意:
我不认为这是最优化的方式:
let combinations = factorial(n: 5)/(factorial(n: 2)*factorial(n: 3)) // 10
答案 0 :(得分:2)
从#include<stdio.h>
int prime(int p, int q, int r);
int main(){
int n,c=0;
scanf("%d",&n);
for(int j=2;j<=n;j++){
int t=0;
for(int i=1;i<=j;i++){
if(j%i==0){
t++;
}
}
if(t==2){ //check whether J is prime or not
// printf(" %d ",j);
c=prime(n,j,0); //check whether j has any factors with N
if(c!=0){
printf(" %d ",j);
printf(" %d \n",c);
}
}
}
return 0;
}
int prime(int p,int q,int r){
if(p%q==0){
r++;
prime(p/q,q,r);
}
else{
return r;
}
}
中选择public int addNumbers(int num1, int num2)
{
return num1 + num2;
}
项的方式的数量由下式给出
binomial coefficient k
。
multiplicative formula Pascal's triangle
对于非负n
和C(n, k)
,可以在Swift中实现
n
这比使用因子的公式“更好”
k
从某种意义上说,中间值不会变得那么大。 (但可以溢出,例如
/// Binimomial coefficient C(n, k) for non-negative integers n, k.
func binomial(n: Int, _ k: Int) -> Int {
precondition(k >= 0 && n >= 0)
if (k > n) { return 0 }
var result = 1
for i in 0 ..< min(k, n-k) {
result = (result * (n - i))/(i + 1)
}
return result
}
超出了64位整数的范围!)
示例({{3}}):
C(n, k) = n! / (k! * (n-k)!)
在您的特殊情况下,C(70, 35) = 112186277816662845432
之间的握手次数
人是for n in 0...7 {
print((0...n).map { k in binomial(n, k) })
}
// Output:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
。您可以使用上面的计算
功能或只是
n