素数筛选

“埃式筛法”

具体步骤:引用百度百科

求25以内的所有素数

  1. 列出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,序列变成:

    • 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

  3. 将剩下序列中,划掉2的倍数,序列变成:

    • 2 3 5 7 9 11 13 15 17 19 21 23 25

  4. 如果现在这个序列中最大数小于最后一个标出的素数的平方,那么剩下的序列中所有的数都是素数,否则回到第二步。

  5. 本例中,因为25大于2的平方,我们返回第二步:

  6. 剩下的序列中第一个素数是3,将主序列中3的倍数划掉,主序列变成:

    • 2 3 5 7 11 13 17 19 23 25

  7. 我们得到的素数有:2,3

  8. 25仍然大于3的平方,所以我们还要返回第二步:

  9. 现在序列中第一个素数是5,同样将序列中5的倍数划掉,主序列成了:

    • 2 3 5 7 11 13 17 19 23

  10. 我们得到的素数有:2,3,5 。

  11. 因为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)。

入门数学(二)素数,质因数分解相关推荐

  1. 水仙花数素数质因数分解的C语言实现

    最近,我翻了一下之前的C语言教材,看了三个有意思的小程序,包括:寻找"水仙花数".判断某数是否为素数.对一个数进行质因数分解.我想把这三个东西放到一个程序中,便写下了此文. 算法步 ...

  2. 【期望dp 质因数分解】cf1139D. Steps to One

    有一种组合方向的考虑有没有dalao肯高抬啊? 题目大意 有一个初始为空的数组$a$,按照以下的流程进行操作: 在$1\cdots m$中等概率选出一个数$x$并添加到$a$的末尾 如果$a$中所有元 ...

  3. 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)

    太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...

  4. 素数、最大公约数、最下公倍数、质因数分解

    2013-08-18 11:20:43 素数.最大公约数.最下公倍数.质因数分解都是与素数相关的,解决了素数的问题,其他的都可以此为基础求解. 小结: 求1到n之间的素数的基本方法是通过遍历2到sqr ...

  5. 【PAT笔记】数学问题——素数和质因数

    1 素数 1.1 素数的判断 素数的判断较为简单,直接上代码,需要注意的几点: bool isPrime(int n){if(n==1) return false; //1需要特判int sqr=(i ...

  6. java 判断一个数是正整数_【Java】P1075 质因数分解—关于数学方法在解题中的运用—(OJ:洛谷)...

    点击上方"蓝字"关注我们了解更多算法思路01题目 题目来源:洛谷OJ 题目链接: https://www.luogu.com.cn/ 题目描述 已知正整数n是两个不同的质数的乘积, ...

  7. C++判断是否为素数、求一个数的因数、质因数分解

    判断一个数是否为素数 #include<iostream> #include<vector> #include<math.h> #include<algori ...

  8. 找素数,分解质因数(python)

    文章目录 题目 1525: 蓝桥杯算法提高VIP-找素数 分析 代码 通过截图 题目 1464: 蓝桥杯基础练习VIP-分解质因数 分析 代码 通过截图 题目 1525: 蓝桥杯算法提高VIP-找素数 ...

  9. 素数c分解语言程序,深入分析C语言分解质因数的实现方法

    首先来看一个最简单的C语言实现质因数分解的列子: #include void main( ) { int data, i = 2; scanf("%d", &data); ...

  10. 算法入门—质因数分解

    α. 质因数分解 每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,236可以写成三个质数相乘的数,这就是质因数分解. 236 = 2 * 2 * 59 β. 素数与素数筛 素数与 ...

最新文章

  1. 设计模式(十五):Iterator迭代器模式 -- 行为型模式
  2. XenApp_XenDesktop_7.6实战篇之十五:StoreFront的配置
  3. InfoPath发布要点
  4. [zhuan]二叉树遍历算法实现(C#2.0)
  5. 租房还是买房结婚?大数据告诉你年轻人的真实想法
  6. Cookie防伪造防修改
  7. facebook对话链接_Facebook已开源其最新的聊天机器人Blender
  8. Spring官方都说废掉GuavaCache用Caffeine,你还不换?
  9. 【Intellij】Hot Swap Failed class reloaded
  10. ios开发之--令UITableView滚动到指定位置
  11. Android仿人人客户端(v5.7.1)——采用RelativeLayout做父容器,实现左侧滑动菜单(一)...
  12. 济宁与华为企业云战略合作携手推进云计算产业发展
  13. 一起学习x86/x64知识(一)
  14. bug宝典linux篇 LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory(转)
  15. 城市间紧急救援 (25 分)(Dijkstra)
  16. android6.0 goldfish内核,ubuntu16.04下编译android-goldfish-3.4内核源码(android6.0.1系统源代码)...
  17. python下载快手视频教程_[小玩意] 用Python写了个下载快手视频的小脚本
  18. SqlParameter的使用
  19. Thinkpad部分软件相关服务进程的总结
  20. 格式化xml文件排版String

热门文章

  1. IntelliJ IDEA商业版 -- 破解
  2. ARMCortex系列仿真调试器
  3. VBA打开已加密的Excel文件
  4. 【Linux】linux的vim文件怎么全选复制、粘贴
  5. 覃卫平java,广西外国语学院与柳州市柳江区实验高中、柳城县中学签订优质生源基地协议并圆满完成挂牌仪式...
  6. 微信传文件又慢又限制大小?试试这3个免费在线传文件工具!
  7. 毕业论文-----有关目录的全部问题
  8. DelphiXE7操作sqlite数据库
  9. 算法竞赛进阶指南---0x05(排序)七夕祭
  10. B端产品的特点及开发经验