欧拉工程第3题 找出一个合数的最大质数因子

本文介绍两种算法来找出一个特定大数的最大质数因子。一种是从最小的质数开始逐步除以该数直至无法整除;另一种则是从该数平方根的质数开始向下检查。通过这两种方法成功找到600851475143的最大质数因子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2# 题目

13195的质数因子有5,7,13和29.

600851475143的最大质数因子是多少?

解题方法

方法1

  1. 题目要求最大的质数因子,所以我们需要一个判断一个数是否为质数的函数,判断从2开始到max的数是否为质数。max这个上界取600851475143的平方根。
  2. 以160做演示,将160依次对素数数组的每个元素进行求余,如果余数为0代表能整除,那么就将160除以这个素数,结果作为新的数继续对这个素数进行整除判断,如果可以整除,则继续以相除的结果作为新的开始。
  3. 当num为1时,返回最后一个除数(素数)即5,数值变化参照下表
变量除数(素数)
num1602
num802
num402
num202
num102
num55
num1

程序

程序中用到的Prime类是我自定义的工具类,因为在做欧拉工程的题目遇到很多素数相关的题目,所以我实现了一个Prime工具类,方便解题。具体的源码以及用法参考我的另一篇文章——《Java工具类 素数类》

public static void solve() {
    long num = 600851475143L;
    int[] primeArray = Prime.getPrimeArrayBelow((int) Math.sqrt(num));
    int i = 0;
    for (; num != 1; i++) {
        while (num % primeArray[i] == 0) {
            num /= primeArray[i];
        }
    }
    System.out.println(primeArray[i - 1]);
}

方法2

方法1从最小的质数开始除,直到将num除尽,方法2则从上界开始除。

程序

public static void solve() {
    long num = 600851475143L;
    int[] primeArray = Prime.getPrimeArrayBelow((int) Math.sqrt(num));
    for (int i = primeArray.length - 1; i != -1 ; i--) {
        if (num % primeArray[i] == 0) {
            System.out.println(primeArray[i]);
            break;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值