将每个数分解质因子,将其各个不同的质因子在数组上相应加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; }