找出10000以内对应的素数,然后计算出式子中每个素数对应的指数值,然后进行计算即可,具体实现见如下代码:
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
#include<functional>
using namespace std;
vector<int> prime;
int e[10010];
bool is_prime(int n){
for (int i = 2; i*i <= n; i++){
if (n%i == 0) return false;
}
return true;
}
void getExp(int num,int d){
for (int i = 0; i < prime.size(); i++){
while (num%prime[i] == 0){
num = num / prime[i];
e[i] += d;
}
if (num == 1) break;
}
}
void CountExp(int num,int d){
for (int i = 2; i <= num; i++){
getExp(i,d);
}
}
int main(){
for (int i = 2; i <= 10000; i++){
if (is_prime(i)) prime.push_back(i);
}
int p, q, r, s;
while (cin >> p >> q >> r >> s){
memset(e, 0, sizeof(e));
CountExp(p,1);
CountExp(s, 1);
CountExp(r - s, 1);
CountExp(q, -1);
CountExp(p - q, -1);
CountExp(r, -1);
double ans = 1;
for (int i = 0; i < prime.size(); i++){
ans *= pow(prime[i], e[i]);
}
printf("%.5lf\n",ans);
}
return 0;
}