入门数学(二)素数,质因数分解
素数筛选
“埃式筛法”
具体步骤:引用百度百科
求25以内的所有素数
列出2以后的所有序列:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
标出序列中的第一个素数,也就是2,序列变成:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
将剩下序列中,划掉2的倍数,序列变成:
2 3 5 7 9 11 13 15 17 19 21 23 25
如果现在这个序列中最大数小于最后一个标出的素数的平方,那么剩下的序列中所有的数都是素数,否则回到第二步。
本例中,因为25大于2的平方,我们返回第二步:
剩下的序列中第一个素数是3,将主序列中3的倍数划掉,主序列变成:
2 3 5 7 11 13 17 19 23 25
我们得到的素数有:2,3
25仍然大于3的平方,所以我们还要返回第二步:
现在序列中第一个素数是5,同样将序列中5的倍数划掉,主序列成了:
2 3 5 7 11 13 17 19 23
我们得到的素数有:2,3,5 。
因为23小于5的平方,跳出循环.
结论:2到25之间的素数是:2 3 5 7 11 13 17 19 23。
原理当从小到大达到某数a时,如果a没有被前面步骤的数筛去,那么a一定是素数。因为,如果a不是素数,那么a一定有小于a的因子,这样在之前的步骤中a一定会被筛去。所以当枚举到a时,还没有被筛去,那么a一定为素数。
代码如下
const int maxn = 101;
int prime[maxn], pNum = 0;
bool p[maxn] = {0};
void Find_Prime(){for(int i = 2; i < maxn; i++){if(p[i] == false){prime[pNum++] = i;for(int j = i + i; j < maxn; j += i){p[j] = true;}}}
}
质因子分解
时间复杂度O(根号n)
由于每个质因子都可能出现不只一次,所以我们用结构体factor用来存放质因子及其个数,
const int maxn = 101;
struct factor{int x, cnt; //x为质因子数,cnt为其个数
}fac[maxn];
例如给你个180 求 180fac【】数组如下
fac[0].x = 2;
fac[0].cnt = 2;fac[1].x = 3;
fac[1].cnt = 2;fac[2].x = 5;
fac[2].cnt = 1;
因为 2 * 3 * 5 * 7 * 11 *13 *17 *19 * 23 *29 已经超过int 的范围,所有对于一个int 类型的数求他的质因数,fac【】数组只需要开到10即可。
对于任意一个数 n 来说。如果它存在除了1 和它本身之外的因子,那么一定是在sqrt(n)的左右成对出现的。而题上问是这个数的质因子,那么这个范围又会进一步缩小,对于一个整数n来说,如果它存在【2,n】范围内的质因子,要么这些质因子全部小于等于sqrt(n)要么只存在一个大于sqrt(n)的质因子,其余质因子全部小于等于sqrt(n)。
做法:枚举1~sqrt(n)范围内的所有因子p,判断p是否是n的因子。
如果p是n的因子,那么fac【】数组中增加质因子p,并初始化其个数为 0,继续除以p每次令p的个数+1,直到p不再是n的因子为止。
if(n % prime[i] == 0){fac[num].x = prime[i];fac[num].cnt = 0;while(n % prime[i] == 0){fac[num].cnt++;n /= prime[i]; }num++;
}
如果p不是n的因子直接跳过。
如果在上述操作后n还>1,说明n有且只有一个大于sqrt(n) 的质因子(可能就是n本身),这时需要把这个因子+入fac数组,并令其个数为1
if(n != 1){fac[num].x = n;fac[num++].cnt = 1;
}
时间复杂度O(根号n)。
入门数学(二)素数,质因数分解相关推荐
- 水仙花数素数质因数分解的C语言实现
最近,我翻了一下之前的C语言教材,看了三个有意思的小程序,包括:寻找"水仙花数".判断某数是否为素数.对一个数进行质因数分解.我想把这三个东西放到一个程序中,便写下了此文. 算法步 ...
- 【期望dp 质因数分解】cf1139D. Steps to One
有一种组合方向的考虑有没有dalao肯高抬啊? 题目大意 有一个初始为空的数组$a$,按照以下的流程进行操作: 在$1\cdots m$中等概率选出一个数$x$并添加到$a$的末尾 如果$a$中所有元 ...
- 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)
太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...
- 素数、最大公约数、最下公倍数、质因数分解
2013-08-18 11:20:43 素数.最大公约数.最下公倍数.质因数分解都是与素数相关的,解决了素数的问题,其他的都可以此为基础求解. 小结: 求1到n之间的素数的基本方法是通过遍历2到sqr ...
- 【PAT笔记】数学问题——素数和质因数
1 素数 1.1 素数的判断 素数的判断较为简单,直接上代码,需要注意的几点: bool isPrime(int n){if(n==1) return false; //1需要特判int sqr=(i ...
- java 判断一个数是正整数_【Java】P1075 质因数分解—关于数学方法在解题中的运用—(OJ:洛谷)...
点击上方"蓝字"关注我们了解更多算法思路01题目 题目来源:洛谷OJ 题目链接: https://www.luogu.com.cn/ 题目描述 已知正整数n是两个不同的质数的乘积, ...
- C++判断是否为素数、求一个数的因数、质因数分解
判断一个数是否为素数 #include<iostream> #include<vector> #include<math.h> #include<algori ...
- 找素数,分解质因数(python)
文章目录 题目 1525: 蓝桥杯算法提高VIP-找素数 分析 代码 通过截图 题目 1464: 蓝桥杯基础练习VIP-分解质因数 分析 代码 通过截图 题目 1525: 蓝桥杯算法提高VIP-找素数 ...
- 素数c分解语言程序,深入分析C语言分解质因数的实现方法
首先来看一个最简单的C语言实现质因数分解的列子: #include void main( ) { int data, i = 2; scanf("%d", &data); ...
- 算法入门—质因数分解
α. 质因数分解 每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,236可以写成三个质数相乘的数,这就是质因数分解. 236 = 2 * 2 * 59 β. 素数与素数筛 素数与 ...
最新文章
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
- XenApp_XenDesktop_7.6实战篇之十五:StoreFront的配置
- InfoPath发布要点
- [zhuan]二叉树遍历算法实现(C#2.0)
- 租房还是买房结婚?大数据告诉你年轻人的真实想法
- Cookie防伪造防修改
- facebook对话链接_Facebook已开源其最新的聊天机器人Blender
- Spring官方都说废掉GuavaCache用Caffeine,你还不换?
- 【Intellij】Hot Swap Failed class reloaded
- ios开发之--令UITableView滚动到指定位置
- Android仿人人客户端(v5.7.1)——采用RelativeLayout做父容器,实现左侧滑动菜单(一)...
- 济宁与华为企业云战略合作携手推进云计算产业发展
- 一起学习x86/x64知识(一)
- bug宝典linux篇 LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory(转)
- 城市间紧急救援 (25 分)(Dijkstra)
- android6.0 goldfish内核,ubuntu16.04下编译android-goldfish-3.4内核源码(android6.0.1系统源代码)...
- python下载快手视频教程_[小玩意] 用Python写了个下载快手视频的小脚本
- SqlParameter的使用
- Thinkpad部分软件相关服务进程的总结
- 格式化xml文件排版String