HDU 5428 The Factor (素因数分解)

题意:给出n个数,问这n个数的乘积中至少有三个因子的最小因子。若不存在这样的因子,则输出 -1;

思路:求出每个数的最小的两个素因数,然后输出其中最小的两个数的乘积。

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define INF 0x7fffffff

int isprime[100000],prime[100000],cnt = 0; 
long long num[100000];

int init(){              // 求 1 - 100000内的素数 (100000*100000 > 1000000000)
	int i,j;
	memset(isprime,1,sizeof(isprime));
	for(i=2;i<100000;i++){
		if(!isprime[i])
			continue ;
		prime[cnt++] = i;
		for(j =i+i;j<100000;j+=i)
			isprime[j] = 0;
	}
}

int main(){
	int i,j,n,t,w,x,p;
	init();
	cin >> t;
	while(t--){
		w = 0;
		scanf("%d",&n);
		for(i=1;i<=n;i++){
			scanf("%d",&x);
			p = 0;
			for(j=0;j<cnt && x >= prime[j] && p<2;j++)
			    while(x%prime[j] == 0){
			    	p++;
			    	num[w++] = prime[j];
			    	x /= prime[j];
			    	if(p >=2 )
			    	    break;
			    }
			if(x != 1)
			    num[w++] = x;
		}
		sort(num,num+w);
		if(w < 2)
		    printf("-1
");
		else
		    printf("%I64d
",num[0]*num[1]);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/jxgapyw/p/4787732.html