对于给定的非负整数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