质因数分解及算法实现
每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数。如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数。而这个因数一定是一个质数。
定义
例子
- 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的值,重复执行第一步。
01
|
#include "stdio.h"
|
02
|
#include "conio.h"
|
03
|
main()
|
04
|
{
|
05
|
int n,i;
|
06
|
printf ( "\nplease input a number:\n" );
|
07
|
scanf ( "%d" ,&n);
|
08
|
printf ( "%d=" ,n);
|
09
|
for (i=2;i<=n;i++)
|
10
|
while (n!=i)
|
11
|
{
|
12
|
if (n%i==0)
|
13
|
{
|
14
|
printf ( "%d*" ,i);
|
15
|
n=n/i;
|
16
|
}
|
17
|
else
|
18
|
break ;
|
19
|
}
|
20
|
printf ( "%d" ,n);
|
21
|
getch();
|
22
|
}
|
另一种形式:
01
|
//返回质因数数组
|
02
|
Integer[] decPrime( int n) {
|
03
|
List<Integer> list = new ArrayList<Integer>();
|
04
|
for ( int i=2;i <= n;i++){
|
05
|
while (n != i){
|
06
|
if (n%i != 0){
|
07
|
break ; //不能整除肯定不是因数,能够整除在这里一定是质数。因为所有的2,3,5,7
|
08
|
//都被除完之后。剩下的因数只能是奇数,且是质数。
|
09
|
}
|
10
|
list.add(Integer.valueOf(i));
|
11
|
n = n/i;
|
12
|
}
|
13
|
}
|
14
|
list.add(Integer.valueOf(n));
|
15
|
return list.toArray( new Integer[list.size()]);
|
16
|
}
|
另外代码:
。我们用所有正整数试验一下,从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.acmerblog.com/integer-factorization-5124.html
质因数分解及算法实现相关推荐
- 【Python】对大数质因数分解的算法问题
[Python]对大数质因数分解的算法问题 发现问题 尝试分析 最后 我的代码(C1) 百科代码(C2) 发现问题 我是一个初学者,在编写一个分解质因数的代码时,学习到了 Miller-Rabin ...
- 室温固态量子计算机,我国学者在室温固态体系中实现基于单自旋体系的质因数分解量子算法...
贤集网电子信息频道讯:从中国科学技术大学获悉,该校杜江峰院士课题组利用金刚石中的自旋作为量子处理器,近期在室温大气条件下实现了基于固态单自旋体系的质因数分解量子算法,向建造室温固态量子计算机迈进了重要 ...
- 输出递归因数分解php,[学习笔记] Miller-Rabin质数测试 Pollard-Rho质因数分解
Miller-Rabin质数测试 & Pollard-Rho质因数分解 考试遇见卡质因数分解的题了...活久见...毒瘤lun 于是就学了一发qaq Pollard-Rho分解质因数的话需要依 ...
- scp量子计算机,室温固态体系中实验实现绝热量子质因数分解
中国科学技术大学杜江峰课题组利用金刚石中的自旋作为量子处理器,首次在室温大气条件下实现了基于固态单自旋体系的质因数分解量子算法.研究成果发表在3月31日的<物理评论快报>上[Phys. R ...
- java质因数算法_Java实现的质因数分解操作示例【基于递归算法】
本文实例讲述了Java实现的质因数分解操作.分享给大家供大家参考,具体如下: 这里演示java通过递归实现质因数分解,代码如下: import java.util.Scanner; public cl ...
- 常用简单算法-质因数分解
对于质因数分解,在做题当中是很常用的,有时候还能用他创造奇迹呢. 好了,我们直接开始正题部分. 我们要学习质因数分解前,先了解一下基本知识,任何一个合数都可以由质数相乘获得,例如:4=2*2,6=2* ...
- 算法入门—质因数分解
α. 质因数分解 每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,236可以写成三个质数相乘的数,这就是质因数分解. 236 = 2 * 2 * 59 β. 素数与素数筛 素数与 ...
- 素数、最大公约数、最下公倍数、质因数分解
2013-08-18 11:20:43 素数.最大公约数.最下公倍数.质因数分解都是与素数相关的,解决了素数的问题,其他的都可以此为基础求解. 小结: 求1到n之间的素数的基本方法是通过遍历2到sqr ...
- C++实现质因数分解
质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数):否则称为合数.根据算术基本定理,每一个比1大的整数,要 ...
最新文章
- 干货分享:自动驾驶核心技术进展之车用毫米波雷达
- 虚拟机克隆,并设置新的ip,配置hostname,配合hostname,hosts
- c++如何防止一个类被其他类继承?
- com 名字对象(3)使用IMoniker
- mac p配置android开发,Mac 下配置Android 环境变量
- 华山论“件”:Kafka、RabbitMQ、RocketMQ技能大比拼
- flex 左右布局_web前端学习:移动端开发常用布局—前端弹性布局总结
- 95-280-035-源码-资源管理-计算资源管理-TaskSlot
- jquery mobile常用的data-role类型
- 盘点那些不为大众所知,却暗地里很“牛逼”的软件
- 互联网行业数据安全建设实践方案
- 惠普主板f1怎么关闭_惠普台式机开机按F1怎样去除
- 成长篇-靡有不凡鲜克有终-02
- c语言中while(a)、if(a)、while(!a)、if(!a)、if(%a)是什么意思?
- 05,JavaScript脚本中cookie
- 指爱打字群添雨跟打器使用教程(指爱群新手教程)-by指爱群友
- 技术开发合同中的知识产权归属问题研究
- autopilot_donkey car
- 2022保密教育线上培训考试 06
- 用C语言判断三条边能不能形成三角形并计算出面积