Big Division
题目大意:输入两行数,分别以其乘积作为分母和分子,输出化约分后的答案。
解题思路:fac数组记录分子和分母质因子出现的次数,如果是分子的话 +1 ,分母的话 -1 ,最后如果fac[i]>0 ,说明分子较大,ans*= pow(i1.0,fac[i])即可,分母的话 ans= pow(i*1.0, - fac[i]);
Code:
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int fac[1000005];
void factor(int n,int f){
int a=1;
for(int i=2;i<=n/i;i+=a,a=2){ //优化分解质因子,偶数的话直接晒掉了 1 3 5 7 9 11 ~~~~
if(n%i==0){
while(n%i==0){
fac[i]+=f;
n/=i;
}
}
}
if(n>1) fac[n]+=f;
}
int main(){
int n,m,tmp,cas,maxs=0;
scanf("%d",&cas);
for(int k=1;k<=cas;k++){
memset(fac,0,sizeof fac);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&tmp);
factor(tmp,1);
maxs=max(maxs,tmp);
}
for(int i=1;i<=m;i++){
scanf("%d",&tmp);
factor(tmp,-1);
maxs=max(maxs,tmp);
}
int ans=1,ans2=1;
for(int i=2;i<=maxs;i++){
if(fac[i]>0) ans*=pow(i*1.0,fac[i]);
if(fac[i]<0) ans2*=pow(i*1.0,-fac[i]);
}
printf("Case #%d: %d / %d\n",k,ans,ans2);
}
return 0;
}