题目描述 Description
给出N个数字,试求质因数最大的数字。
输入描述 Input Description
第一行,一个整数N,表示数字个数。
接下来N行,每行一个整数ai,表示给出的数字。
输出描述 Output Description
一个整数,表示质因数最大的数字。(如果有多个最大相同,则输出最后输入那一个)
样例输入 Sample Input
4
35
60
40
42
样例输出 Sample Output
42
数据范围及提示 Data Size & Hint
N≤10^6,2≤ai≤10^6
用cin可能会导致超时
好久没写博客了(一个多月了)
发个博客证明我的存在
思路就是先预处理1-10^6的所有质数(线性筛素数),再挨个查找
有几个地方要注意,一是数据较大,最好用读入优化,下面来看看
cin PK 读入优化
cin:
读入优化:
总时间:
显而易见。
再就是剪枝。
如果当前数要比找的下一个质数小
也就是 x < prime[i] 就跳出
或者 x 小于当前的最大质数 跳出
就可以了
#include<cstdio>
#include<iostream>
#define MAXN 20000
#define INF 1000010
using namespace std;
int n,x,maxx=-1,m,zhi=-1;
bool vis[INF];
int tot,prime[INF];
inline void read(int&x) {
x=0;char c=getchar();
while(c>'9'||c<'0') c=getchar();
while(c>='0'&&c<='9') x=10*x+c-48,c=getchar();
}
inline void prim() {
for(int i=2;i<=INF;i++) {
if(!vis[i]) prime[++tot]=i;
for(int j=1;j<=tot&&(i*prime[j]<=INF);j++) {
vis[i*prime[j]]=true;
if(!(i%prime[j])) break;
}
}
}
int main() {
read(n);
prim();
//for(int i=1;i<=tot;i++) printf("%d\n",prime[i]);
for(int i=1;i<=n;i++) {
cin>>x;
if(!vis[x]) {if(x>zhi) maxx=x,zhi=x;}
else {
m=x;
for(int i=1;i<=tot;i++) {
if(x<prime[i]) break;
if(x<zhi) break;
if(x%prime[i]==0) {
if(prime[i]>zhi) {
zhi=prime[i];
maxx=m;
x/=zhi;
}
else if(prime[i]==zhi) {
maxx=max(maxx,m);
x/=zhi;
}
}
}
}
}
printf("%d\n",maxx);
return 0;
}