在寻找一个数的素因子时:
1.任何正整数都可以唯一地被分解成若干个素数的乘积。
这个定理是数论中的基本定理之一,被称为算术基本定理。
可以这么理解:这个数有两种情况:①素数,则不用分解;②合数,则根据概念,合数就是除了自身和1之外还有其他因子,所以它一定可以分解成其他因子。
这些因子又进入上面判断,如果是素数就结束,如果是合数就又可以这样分解下去,直到两个都是素数。结局就是唯一地被分解成若干个素数的乘积。
2.考虑关于一个大于1的正整数i,可以写成 i=a*b,我说这两个数其中一定存在一个数<=。
3.就是对i进行素因子分解,如果是它的素因子,则有且只能有一个。
这一点我们可以由反证法证明:如果存在两个大于的数是i的素因子则这两个数相乘之后一定大于i本身。
所以,我们可以直接从2开始一直整除目标数i,值记为a,迭代更新a;2整除到不能再除时换下一个素数继续除,但是有个问题就是在写代码时没有一个素数序列,这个时候我们这么解决:
采用奇数序列,2之后也就是3,然后是5、7,接着是9,这个时候我们注意,这个时候b一定不能被9整除,因为所有可以被9整除的数都可以被3整除,也就是虽然用奇数序列,但是奇数序列里面的合数不可能起作用,因为这个奇数序列里面的合数(比如9)的因子一定比本身小,所以目标数已经被提前处理过。
直到处理到,就结束。
接下来贴一下处理代码:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static List<Integer> primeFactors(int n) {
List<Integer> factors = new ArrayList<>();
// 处理偶数因子
while (n % 2 == 0) {
factors.add(2);
n /= 2;
}
// 处理奇数因子
for (int i = 3; i <= Math.sqrt(n); i += 2) {
while (n % i == 0) {
factors.add(i);
n /= i;
}
}
// 处理剩余的素数
if (n > 2) {
factors.add(n);
}
return factors;
}
public static void main(String[] args) {
int number = 56;
List<Integer> factors = primeFactors(number);
System.out.println("The prime factors of " + number + " are: " + factors);
}
}