题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5428
题目大意:给你若干个整数,让你输出这些数乘积的一个最小因子,并且这个因子至少有3个因子。
关键思想:分解质因数,我们要找的其实就是两个最小质因数的乘积。我的算法关键就是维护最小的两个质因数。
代码如下:
#include <iostream> #include <cmath> #include <cstdio> #include <algorithm> using namespace std; const int inf=0x3f3f3f3f; const int MAXN=105; int min1,min2; void PrimeFac(int n){//分解质因数 bool flag=false; for(int i=2;i<=n;i++){ while(n!=i){ if(n%i==0){ if(min1>min2)min1=min(i,min1); else min2=min(i,min2); n/=i; }else break; } if(i>=max(min1,min2)){ return; } } if(min1>min2)min1=min(n,min1); else min2=min(n,min2); return; } bool isPrime(int n){ for(int i=2;i<=sqrt(n);i++){ if(n%i==0)return false; } return true; } int main(){ int T,n,tmp,ans; scanf("%d",&T); while(T--){ min1=inf,min2=inf; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&tmp); if(tmp==1)continue; if(isPrime(tmp)){ if(min1>min2)min1=min(tmp,min1); else min2=min(tmp,min2); }else PrimeFac(tmp); } if(min1==inf||min2==inf)printf("-1\n"); else printf("%lld\n",(long long)min1*min2);//结果可能超出int范围,WA了几发 } return 0; }