题解 | #kotori和素因子#

kotori和素因子

https://www.nowcoder.com/practice/7b1c858a3e7a41ed8364178979eaae67

总结:
1.在计算素数时,除数只需要计算到Math.sqrt(n),不需要遍历到n.而且虽然1不是素因子,但n/1可能是素因子,这种情况应该考虑在内。
2.当将每个整数的因子统计好后,可以使用深度优先搜索,逐层寻找素因子,也可以使用数组统计已被访问过的因子。

import java.util.*;
public class Main{
    public static  int min = 65535;
    private static List<List<Integer>> list = new ArrayList<>();//记录每个数的素因子集合
    private static Set<Integer> hash = new HashSet<>();//用于统计被访问过的素因子。
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int l = Integer.valueOf(sc.nextLine());
        String[] num = sc.nextLine().split(" ");


        for(String s:num){
            int n = Integer.valueOf(s);
            List<Integer> k = new ArrayList<>();
            for(int i=1;i<=Math.sqrt(n);i++){
                if(n%i==0){
                    if(isPrime(i)){
                        k.add(i);
                    }
                    if(isPrime(n/i)){
                        k.add(n/i);
                    }
                }
            }
            list.add(k);
        }
        dfs(0);
        if(min==65535)
            System.out.println(-1);
        else
            System.out.println(min);
    }
    public static void dfs(int deepth){
        if(deepth==list.size()){
            int add = 0;
            for(int a:hash){
                add+=a;
            }
            min = Math.min(min,add);
            return;
        }
        int size = list.get(deepth).size();
        for(int j=0;j<size;j++){
            int e = list.get(deepth).get(j);
            if(hash.contains(e))
                continue;
            hash.add(e);
            dfs(deepth+1);
            hash.remove(e);
        }

    }
    public static boolean isPrime(int n){
        if(n==1)
            return false;
        for(int i=2;i<=Math.sqrt(n);i++){
            if(n%i==0)
                return false;
        }
        return true;
    }
}
全部评论
为什么最后还要加hash.remove()呢?
1 回复 分享
发布于 2023-06-27 00:05 四川
上面代码的核心原理是依次从素因子集合中取出一个组成一个路径(不重复序列),放入hash中计算出和。然后就要去找可能存在的新路径放入hash中,所以要将之前的序列元素依次退出hash。最后取所有路径和的最小值。 如果遇到不懂的代码,在没其他人的及时帮助下,加断点去调试看代码实现的功能是一个不错且有效的方法。
点赞 回复 分享
发布于 05-06 19:15 河南
假设为整数为4 5 6 7 8,4的素因子集合为{2,2},会多出一倍的无用功
点赞 回复 分享
发布于 05-06 19:47 河南
remove相当于回溯。 这个dfs本质是每个数选出一个质因子。
点赞 回复 分享
发布于 09-26 19:07 湖北

相关推荐

头像
10-15 22:27
已编辑
门头沟学院 C++
罗格镇的小镇做题家:我投了hr打电话来说学历太低了不符合要求,建议投荣耀,结果荣耀也投了一定水花没有,非本211硕
投递华为等公司10个岗位
点赞 评论 收藏
分享
小谷围鸡肉卷阿姨:+1,腾子投完一动不动
点赞 评论 收藏
分享
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务