#include <stdio.h>
#include <algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int i,j,t,n,m,k,a[100000],b[100000],sign;
while(scanf("%d",&n)!=EOF)
{k=0;
while(n--)
{k++;
t=0;
sign=0;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<m;i++)
{
for(j=1;j*j<=a[i];j++)
{
if(a[i]%j==0)
{
if(a[i]/j==j) {b[t]=j;t++;}
else
{
b[t]=a[i]/j;
t++;
b[t]=j;
t++;
}
}
}
}
sort(b,b+t,cmp);
for(i=0;i<t-1;i++)
{
if(sign==1) continue;
if(b[i]==b[i+1])
{
printf("Case #%d: %d\n",k,b[i]);
sign=1;
}
}
}
}
return 0;
}
代码超时了 ,有没有谁给个优解啊!!!求求
来人啊
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 100010
int vis[maxn];
int main()
{
int test, n, mark = 1;
scanf("%d", &test);
while(test--)
{
scanf("%d", &n);
memset(vis,0,sizeof(vis));
int t, Max = 0;
for(int i = 0; i < n; i++)
{
scanf("%d", &t);
Max = max(Max, t);
int lim = (int) sqrt((double)t);
for(int j = 1; j <= lim; j++) if(t % j == 0)
{
vis[j]++;
vis[t / j]++;
}
if(lim * lim == t)
{vis[t]--; }
printf("Case #%d: ", mark++);
for(int i = Max; i >= 1; i--)
{
if(vis[i] >= 2)
{ printf("%d\n",i); break;
}
}
return 0;
}