UVA - 10375 Choose and divide

来源:互联网 发布:网络安全保卫大队在哪 编辑:程序博客网 时间:2024/05/17 16:01

分子分母分别分解成素数的乘积,先约分,后计算


#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn= 10000+10;int a[maxn], pri[maxn],num[maxn];int cnt=0;void get_maxn(){    for(int i =2,temp;i<maxn;i++){        if(a[i]==0){            pri[cnt++]=i;            temp=i*i;            while(temp<maxn){                a[temp]=1;                temp+=i;            }        }    }    return;}void add_integer(int n,int d){    for(int i=0; i< cnt;i++){        while(n % pri[i] == 0){            n /= pri[i];            num[i] += d;        }        if(n==1) break;    }}void add_factorial(int n, int d){    for(int i = 1;i <= n; i++){        add_integer(i,d);    }}int main(){    get_maxn();    int p,q,r,s;    while(scanf("%d%d%d%d",&p,&q,&r,&s)!=EOF){        memset(num,0,sizeof(num));        add_factorial(p,1);        add_factorial(s,1);        add_factorial(r-s,1);        add_factorial(q,-1);        add_factorial(p-q,-1);        add_factorial(r,-1);        double n=1;        for(int i=0;i<cnt; i++){            while(num[i]>0){                n*=(double)pri[i];                num[i]--;            }            while(num[i]<0){                n/=(double)pri[i];                num[i]++;            }        }        printf("%.5f\n",n);    }    return 0;}


0 0
原创粉丝点击