判断质数和用算数基本定理分解质因数
判断质数和用算数基本定理分解质因数
摘要
本文主要讲解如何判断一个数是质数,和如何对一个数分解质因数。本文是很基础的也很重要的数学知识。
质数
质数又称为素数,是指大于1的并且除了1和它本身外,没有其他因数的自然数。
判断一个数是否是质数
假设该数为n, 我们只需要判断
\[[2, \sqrt{n}
]
\]
内是否有n的因子。如果有,则n为合数,否则,n为质数。
这种方法被称为试除法, 即试着除一下所有可能的因子。
试除法代码:
public static Boolean isprime(int n){
if(n == 1) return false;
for(int i = 2; i <= n / i; i++){
if(n % i == 0){
return false;
}
}
return true;
}
注意:以上代码中,for循环的结束条件是 i <= n/i,相当于i <= sqrt(n),两种写法都可以,只不过调用sqrt()函数会慢一些,因为for循环每次循环都会调用该函数。另外,不能写成i * i <= n
因为当n很接近int的最大值时,i*i可能会溢出。
分解质因数
根据算术基本定理又称唯一分解定理,对于任何一个合数, 我们都可以用几个质数的幂的乘积来表示。
\[N =p_1^{k_1}*p_2^{k_2}*... *p_n^{k_n}
, p_1<p_2<...<p_n
\]
如
\[12=2^2∗3
\]
\[20 = 2^2*5
\]
\[30 = 2^2*5
\]
接下来我们利用这个公式分解质因数。
设一个质数为p.如果n%p == 0,那么p就是n的一个质因数,接下来就是求p的指数,我们让n = n/p, 这样就从n中剔除了一个p,接着重复上述两步,直到n%p != 0
代码
public static void prime(int n){
for(int i = 2; i <= n / i; i++){
int a = 0, b = 0;
while(n % i == 0){
a = i;
n /= i;
b++;
}
if(b > 0)
System.out.println(a + " " + b);
}
if(n > 1) System.out.println(n + " " + 1);
}
注意:以上代码中for循环的结束条件也是i <= n / i,因为根据公式,最多只可能有一个质因数是大于
\[\sqrt{n}
\]
,因为有两个的话,乘积肯定超过n了。所以当for循环结束后判断n是否大于1,如果大于就说明有一个大于
\[ \sqrt{n}
\]
的质因数。
注: 转载于 https://blog.csdn.net/GD_ONE/article/details/104579936

浙公网安备 33010602011771号