用暴力很麻烦,就只有分解了。
1. 求10000内的素数
2. 把每个分子分母分解----成-----素数的幂形式
eg: 5!/4!
1. 5!= 1, 2, 3, 4, 5; 1 = 1^1; 2 = 2^1; 3 = 3^1; 4 = 2^2;.........即把任意数分解为素数的乘积: 12 = 2^2 * 3; 42 = 2*3*7;....
2. 依据上面 5!对应幂: 2有3个, 3有1个。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int xprime = 0, maxn = 10005;
static int prime[] = new int[maxn];
static int e[] = new int[maxn];
public static void main(String[] args) {
getPrime();
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt()){
int p, q, r, s;
p = sc.nextInt();
q = sc.nextInt();
r = sc.nextInt();
s = sc.nextInt();
Arrays.fill(e, 0);
add_factorial(p, 1);
add_factorial(q, -1);
add_factorial(p-q, -1);
add_factorial(s, 1);
add_factorial(r-s, 1);
add_factorial(r, -1);
double v = 1;
for(int i=0; i<xprime; i++)
{
if(e[i]!=0){
v = v*Math.pow(prime[i], e[i]);
}
}
System.out.printf("%.5f\n", v);
}
}
static void add_factorial(int p, int d){
for(int i = 1; i<=p; i++)
{
add_integer(i, d);
}
}
static void add_integer(int p, int d){
for(int i = 0; i<xprime; i++){
while(p%prime[i] == 0){
e[i] += d;
p/=prime[i];
}
if(p == 1)
return ;
}
}
static void getPrime(){
int c = 0;
boolean vis[] = new boolean[maxn];
for(int i = 2; i<=10000; i++){
if(!vis[i]) prime[xprime++] = i;
for(int j = 0; j<xprime && i*prime[j]<=10000; j++){
vis[i*prime[j]] = true;
c++;
if(i % prime[j] == 0) break;
}
}
// System.out.println(c);
// System.out.println(xprime);
}
}