HDU 5428 [The Factor] 分解质因数

Posted 哇咔咔咔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5428 [The Factor] 分解质因数相关的知识,希望对你有一定的参考价值。

题目链接: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;
}

 

以上是关于HDU 5428 [The Factor] 分解质因数的主要内容,如果未能解决你的问题,请参考以下文章

数学问题——质因子分解

HDU 4135 Co-prime (容斥+分解质因子)

C - Aladdin and the Flying Carpet (质因子分解,因子个数)

HDU6623 思维题(n分解成质因子的形式,问最小的幂是多少)

HDU 4344-Mark the Rope-大数素因子分解

Remoteland HDU - 4196