蓝桥杯 算法训练 素因子去重 (java)

问题描述
  给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
 
输入格式
  一个整数,表示n
 
输出格式
  输出一行,包含一个整数p。
 
样例输入
1000
 
样例输出
10
 
数据规模和约定
  n<=10^12

样例解释:n=1000=2^3*5*3,p=2*5=10
 
 
思路分析
i从2到n遍历一遍
1. 判断i是否是n的因子并且是素数
2. 如果是素因子,则利用while循环,一直除以i来去重,素因子去重后,将素因子添加到集合中,i++,重复第1
3. 如果不是素因子,i++,重复第1
4. 循环结束后,将集合里的所有素因子相乘,即得到p
 
java 代码如下:
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Long n = new Scanner(System.in).nextLong();
        ArrayList<Long> list = new ArrayList<Long>();
        //从2到n找素因子
        for (long i = 2; i <= n; i++) {
            //i是素因子
            if(n%i==0 && juge(i)){
                //素因子去重
                while(n%i==0){
                    n/=i;
                }
                
                //将素因子添加到集合
                list.add(i);
                if(n<i)
                    break;
            }
        }
        
        long p = 1;
        //将所有素因子相乘,得出最后结果p
        for (int i = 0; i < list.size(); i++) {
            p*=(long)list.get(i);
        }
        System.out.println(p);
    }
    
    //判断因子是否是素数
    public static boolean juge(long m){
        int sqrt = (int) Math.sqrt(m);
        for (int i = 2; i <= sqrt; i++) {
            if(m%i==0)
                return false;
        }
        return true;
    }
}

猜你喜欢

转载自www.cnblogs.com/l199616j/p/10584655.html