将每个数分解质因子,将其各个不同的质因子在数组上相应加1,最后遍历数组统计最大值即可,注意处理数为1的情况。
# include <stdio.h>
# include <string.h>
# define MAXN 100000
int max(int a, int b){return a>b?a:b;}
int main()
{
int i, j, n, imax, num, len=0, p[MAXN+1], c[MAXN+1], a[MAXN+1];
memset(p, 0, sizeof(p));
for(i=2; i<=MAXN; ++i)
if(!p[i])
{
c[++len] = i;//记录质数
for(j=i; j<=MAXN; j+=i)
p[j] = 1;
}
while(~scanf("%d",&n))
{
memset(a, 0, sizeof(a));
imax = -1;
while(n--)
{
scanf("%d",&num);
if(num==1)
a[1] = 1;
for(i=1; c[i]*c[i]<=num && i<=len; ++i)//分解质因子
{
if(!(num%c[i]))
{
++a[c[i]];
for(;!(num%c[i]);num/=c[i]);
}
}
if(num != 1)
++a[num];
}
for(i=1; i<=MAXN; ++i)
imax = max(imax, a[i]);
printf("%d\n",imax);
}
return 0;
}