素因子去重(Java实现)

蓝桥杯练习系统中的算法训练第一题

**题目描述:**给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1。

我看到题的第一反应: …这是不是要我因式分解呀,然后找到因式中所有的素数然后将他们相乘,但是我好像不知道怎样因式分解,判断素数我也只会最简单粗鲁的方法,题目给定的数字这么大,肯定要超时的嘛。然后我就去请教大佬了。

**算法思路:**根据我上面的思路,我们先要因式分解,但是第二步可以在第一步就解决掉,毕竟判断素数还是挺麻烦的。在因式分解时,我们要去掉相同的因子(这一步也是点睛之笔),就比如说给定的数字可以被2整除,那我们先将2放到一个集合中,然后n/2,用一个while循环,一直用n除以2直到除不尽了为止,这样就去掉重复的2这个因子,这样其实我们放到集合中的因子就不会出现合数了,全都是素数,你想如果因子中有合数,那合数也可以分解为两个素数相乘。最后我们只需要将集合中的数相乘即可得到答案。

代码实现:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//素因子去重
public class Main_primedistict {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		long n=scanner.nextLong();  //这里用long存储
		int result=1;
		List<Integer> l
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值