这个题就是求一串数的最小公倍数,但是由于太多了,所以结果会很大,所以需要高精度乘法
#include <iostream>
#include <cmath>
#include <vector>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=1e4+5;
int t,n,k,x;
vector<int> prime;
int vis[maxn];
int arr[maxn];
int ans[maxn];
void divid(int x)//唯一分解
{
for(int i=0; i<prime.size(); i++)
{
if(x%prime[i]==0)
{
int num=0;
while(x%prime[i]==0)
{
num++;
x/=prime[i];
}
arr[i]=max(arr[i],num);//由于是求n个数的最小公倍数,所以每个质因数出现的次数应该是每个数分解后出现次数的最大值
}
if(x==1) break;
}
}
int main()
{
memset(vis,0,sizeof(vis));
for(int i=2; i<=maxn; i++)//筛选素数
{
if(!vis[i])
{
prime.push_back(i);
for(int j=i*2; j<=maxn; j+=i)
vis[j]=1;
}
}
scanf("%d",&t);
while(t--)
{
memset(arr,0,sizeof(arr));
memset(ans,0,sizeof(ans));
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&x);
divid(x);
}
ans[0]=1;
for(int i=0;i<=maxn;i++)
{
if(!arr[i]) continue ;//arr中储存的质因数出现的次数
int val=1;
for(int j=0;j<arr[i];j++)
val*=prime[i];//算出这个质因数的值
for(int j=0;j<1000;j++)
ans[j]=ans[j]*val;//这个地方ans已经是分解完的数了,所以每位都要乘以新的质因数
for(int j=0;j<1000;j++)
{
ans[j+1]+=ans[j]/10000;//将新加进去的质因数分解
ans[j]=ans[j]%10000;
}
}
printf("Case %d: ",++k);
int i=1000;
while(i>=0 && ans[i]==0) i--;//从后往前找到非零值
printf("%d",ans[i--]);
while(i>=0) printf("%04d",ans[i--]);//每个ans储存的是四位数,所以04d
printf("\n");
}
return 0;
}