对于给定的非负整数r和n(r≤n),请编写程序计算组合数C(r,n) = n! / r! / (n-r)!。
(本题目用于测试的所有用例,都保证结果小于231-1)
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* calculate combination Number
* @param r int整型
* @param n int整型
* @return int整型
*/
public int combination (int r, int n) {
// write code here
long ans = 1L;
int t = n - r, i = 0;
while(i < t){
ans *= (n-i)/(t-i);
i++;
}
return (int)ans;
}
} 有啥特殊写法吗,我这疯狂超时,第三个用例就过不去了
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* calculate combination Number
* @param r int整型
* @param n int整型
* @return int整型
*/
public int combination (int r, int n) {
// write code here
if(r == n) return 1;
if(r == 0) return 1;
int halfN = n/2;
if(halfN < r) r = halfN;
int j = n,k=1;
long a = 1L,b=1L;
while(k<=r){
a *= j;
b *= k;
if(a%b == 0){
a /= b;
b = 1L;
}
j--;
k++;
}
return (int)a;
}
} public int combination (int r, int n) {
// write code here
r= Math.min(r, (n - r));
long res=1;
for(int i=n;i>=(n-r+1);i--)
res*=i;
for(int i=1;i<=r;i++)
res/=i;
return (int)res;
}
def choose(r, n):
num1 = 1 num2 = 1
for i in range(1, max(r, n - r)+1):
num1 = num1 * i
for j in range(r, n+1):
num2 = num2 * j
return num2 / num1