每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数。如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数。而这个因数一定是一个质数。
定义
例子
-
1没有质因子。
-
5只有1个质因子,5本身。(5是质数。)
-
6的质因子是2和3。(6 = 2 × 3)
-
2、4、8、16等只有1个质因子:2(2是质数,4 = 2,8 = 2,如此类推。)
-
10有2个质因子:2和5。(10 = 2 × 5)
计算方法

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,
重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
#include "stdio.h"
#include "conio.h"
main()
{
int n,i;
printf("\nplease input a number:\n");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
while(n!=i)
{
if(n%i==0)
{
printf("%d*",i);
n=n/i;
}
else
break;
}
printf("%d",n);
getch();
}
另一种形式://返回质因数数组
Integer[] decPrime(int n) {
List<Integer> list = new ArrayList<Integer>();
for (int i=2;i <= n;i++){
while(n != i){
if(n%i != 0){
break;//不能整除肯定不是因数,能够整除在这里一定是质数。因为所有的2,3,5,7
//都被除完之后。剩下的因数只能是奇数,且是质数。
}
list.add(Integer.valueOf(i));
n = n/i;
}
}
list.add(Integer.valueOf(n));
return list.toArray(new Integer[list.size()]);
}
另外代码:
。我们用所有正整数试验一下,从2开始进行试除,逐步增加除数的值,去寻找一个可以整除n的数。在Eratosthenes筛法的讨论中,我们知道如果n是一个复合数,那么它就会有一个素数 。算法9.3所示的就是这种方法的伪代码。这个算法有两个偱环路径,外部的和内部的。外部循环求唯一因数,内部循环求一个因数的多个复本。例如,
,外部循环求出因数2和3。内部循环求出2是一个多因数。
01 | void
trial_divisio_fac( int
n) |
02 | { |
03 | int a=2; |
04 | while (a*a<=n) |
05 | { |
06 | while (n%a==0) |
07 | { |
08 | cout<<a<<ends; |
09 | n=n/a; |
10 | } |
11 | a++; |
12 | } |
13 | if (n>1) cout<<n; //n没有因数 |
14 | } |
上面的代码解释比较清楚。为什么这种方法可以得到素数。
因为我们在内层循环中,已经把当前a的所有倍数都去除了。这跟埃斯托尼算法是一样的。
复杂度 如果 ,这种情况下试除法通常都是很有效的。但是如果用来分解更大的整数,试除法就变得非常低效甚至不可用了。这种算法的复杂度是随着n的增加呈指数级别增长的。
(
试除法是整数分解算法中最简单和最容易理解的算法。
给定一个合数n(这里,n是待分解的整数),试除法看成是用小于等于的每个素数去试除待分解的整数。如果找到一个数能够整除除尽,这个数就是待分解整数的因子。
).
例9.29
运用试除算法求1233的因数。
1233=3^2*137.
转自:http://www.cnblogs.com/youxin/p/3232049.html