【PAT笔记】数学问题——素数和质因数
1 素数
1.1 素数的判断
素数的判断较为简单,直接上代码,需要注意的几点:
bool isPrime(int n){if(n==1) return false; //1需要特判int sqr=(int)sqrt(n*1.0); //之所以要用这条语句而不是在for循环里使用sqrt(n),解释如下for(int i=2;i<=sqr;i++){if(n%i==0) return false;}return true;
}
在上面的代码中,其中需要用到一条 int sqr=(int)sqrt(n*1.0); 用来在循环中做一个循环边界呢。首先可以从 double sqrt(double) 可以看出,sqrt()的返回值和参数都是double类型的。在计算机中,小数都是不精确的,如,sqrt(9)是等于3.000000000001还是2.999999999999都是不好讲的。有的计算机可能给出前者,有的则可能是后者,这样对我们循环的边界的判断造成了影响。于是就用到了上面一行代码,转化参数的数据类型,保证sqrt得到我们想要的值。
1.2 素数表的获取
下面给出两个方法。
首先是比较常用的,对n不超过是可以的,复杂度包括了判断是否为素数O()和遍历从1到n的复杂度O(n),因此第一种方式(对n不超过)的时间复杂度为O(n) 。下面给出代码:
const int maxn=101;
int Prime[maxn],pNum=0; //数组Prime()存放所有的素数,pNum为素数的个数
bool p[maxn]={0};
void Find_Prime(){for(int i=1;i<maxn;i++){if(isPrime(i)==true){ //判断是否为素数Prime[pNum++]=i;p[i]=true;}}
}
其次是时间复杂度更小的一种方式,为O(),这是一种什么原理的,我们来看:
- 2是素数,因此去掉所有2的倍数,如4,6,8,10,12,14,16,18,20;
- 3没有被前面的步骤筛去,所以3是素数,因此去掉所有3的倍数,如6,9,12,15,18;
- 4被前面的步骤筛去了,所以4不是素数;
- 5没有被前面的步骤筛去,所以5是素数,因此去掉所有5的倍数,如5,10,15,20;
- 6被前面的步骤筛去了,所以6不是素数;
- ……
由上面可以看出,当从小到大达到达到某数n的时候,如果n没有被前面的步骤筛去,那么n就一定是素数。原理是:当n不是素数时,必然有小于n的质因数,这样在之前筛去质因数的倍数的时候就应该把n筛去了。所以,当n没有被前面步骤筛去的时候,就一定是一个素数。于是可以给出如下代码:
const int maxn=101;
int Prime[maxn],pNum; //同样的道理,建立一个数组Prime来存放素数,pNum为苏数的个数
bool p[maxn]={0}; //素数为0,非素数为1
void Find_Prime(int n){for(int i=2;i<max;i++){if(p[i]==0){Prime[pNum++]=i;for(int j=i;j<maxn;j += i){p[j]=true;}}}
}
2 质因数的分解
质因数分解就是将一个整数n分解成若干个素数乘积的形式,如8=222,18=2233等等。素数的寻找上面已经讲过了,而且值得注意的是2357111317192329的积就已经超过了int型的上限了。
我们对于质因数的分解,不妨先设一个结构体:
struct factor{int x,cnt; //x代表了质因数,cnt代表了该质因数的个数
}fac[10];
那么对于180来说,就有
fac[0].x=2;
fac[0].cnt=2;fac[1].x=3;
fac[1].cnt=2;fac[2].x=5;
fac[2].cnt=1;
首先枚举1~sqrt(n)范围内所有质因子p,判断p是否为n的质因数。
const num=0;
void Find_Factor(int n){for(int i=0;i<10;i++){if(n%Prime[i]==0){fac[num].x=Prime[i];fac[num].cnt=0;while(n%fac[num].x==0){fac[num].cnt++;n=n/fac[num].x;}num++;}}
}
如果在上边步骤结束后n人大于1,说明n有且仅有一个质因子(即n本身),这时需要将这个质因子加入fac数组,令其个数为1.
if(n!=1){fac[num].x=n;fac[num++].cnt=1;
}
解释完毕
【PAT笔记】数学问题——素数和质因数相关推荐
- 算法笔记——数学相关
算法笔记--数学相关 高精度 乘法逆元 排列组合 二项式定理 质数的判定和应用 约数 拓展欧几里得 大步小步算法(BSGS) 拓展大步小步算法 快速乘和快速幂 矩阵相关 欧拉函数 欧拉定理及费马小定理 ...
- Maple学习笔记——数学计算与数据处理
Maple学习笔记--数学计算与数据处理 数据计算 多项式相关: 求解方程.不等式 矩阵计算.线性代数: 微积分 多变量和向量微积分 优化 概率与统计 数据处理 导入数据 数据计算 多项式相关: 1. ...
- matlab bwmorph spur,matlab图像处理学习笔记-数学形态与二值图像操作
matlab图像处理学习笔记-数学形态与二值图像操作 数学形态学主要处理的是二值图像,因为二值图像的处理操作比较简单. 9.1 数学形态学图像处理 基本思想:利用一个称作结构元素(structurin ...
- 入门数学(二)素数,质因数分解
素数筛选 "埃式筛法" 具体步骤:引用百度百科 求25以内的所有素数 列出2以后的所有序列: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
- 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)
太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...
- 初试牛客网PAT练习之数素数
正式开始练习PAT,初步选择的练习平台是牛客网(http://www.nowcoder.com/),原因是虽然自己理论学习还不错,但缺乏上手经验,想先在练习平台上实验一段时间后,在正式进驻PAT官网. ...
- pat 乙级 1013 数素数(C++)
题目 令 Pi表示第 i 个素数.现任给两个正整数 M≤N≤104,请输出 PM到 PN的所有素数. 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔. 输出格式: 输出从 PM到 P ...
- [素数拓展] 质因数的个数 [2007年清华大学计算机研究生机试真题]
题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=22235,共有5个质因数. 输入描述: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1< ...
- Composite Coloring(思维 数论(筛素数 分解质因数))
(29条消息) CodeForces - 1332B Composite Coloring(数论+构造)_Frozen_Guardian的博客-CSDN博客 (29条消息) codeforces 13 ...
最新文章
- 【ES6】Promise对象详解
- P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)
- vba循环通过键盘某个按键按下退出循环_51单片机按键检测--独立按键与矩阵键盘...
- .net core 2.0学习笔记(三):度量.net framework 迁移到.net core的工作量
- win10壁纸不能幻灯片放映_有个性,做不同,10分钟让你的Win10酷起来!
- 为什么 Facebook 活得春风得意,而人人网却半死不活?
- apache添加php支持
- BlackMamba:C2后渗透框架
- win10 任务管理器显示GPU占用率
- 简明python教程 答案1
- KK录像机怎么用?KK录像机使用方法介绍
- SOC电源管理系统PMIC
- java中文转英文_Java中文转换为英文拼音
- http状态码 200、404什么意思
- 微信小程序 | 自动定时结束录制
- 谷歌AI论文BERT双向编码器表征模型:机器阅读理解NLP基准11种最优(公号回复“谷歌BERT论文”下载彩标PDF论文)
- NSDate-日期类nbsp;OC——第七天(1)
- 用 python 来操作 docx, xlsx 格式文件(二)(使用 docx 库操作 docx 格式文件
- Android获取WifiMac地址
- 微信小程序数据的接收详解
热门文章
- initWithCoder: 与initWithFrame:
- 从表达式到函数:表面的简洁
- CString::GetBuffer函数作用
- STM32 容易烧成电源短路解决方法
- ESP8266的MQTT客户端搭建教程(基于NONS_SDK_v2.0)
- c 语言学习:基本操作,数组,字符串,指针
- Windows下使用IDEA+Maven搭建本地Hadoop环境
- 基于区块链的健康链系统设计与实现(5)区块链性能优化
- 以太坊节点布置(4) geth节点互联
- 初等数论--同余--WILSON定理