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(),这是一种什么原理的,我们来看:

  1. 2是素数,因此去掉所有2的倍数,如4,6,8,10,12,14,16,18,20;
  2. 3没有被前面的步骤筛去,所以3是素数,因此去掉所有3的倍数,如6,9,12,15,18;
  3. 4被前面的步骤筛去了,所以4不是素数;
  4. 5没有被前面的步骤筛去,所以5是素数,因此去掉所有5的倍数,如5,10,15,20;
  5. 6被前面的步骤筛去了,所以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笔记】数学问题——素数和质因数相关推荐

  1. 算法笔记——数学相关

    算法笔记--数学相关 高精度 乘法逆元 排列组合 二项式定理 质数的判定和应用 约数 拓展欧几里得 大步小步算法(BSGS) 拓展大步小步算法 快速乘和快速幂 矩阵相关 欧拉函数 欧拉定理及费马小定理 ...

  2. Maple学习笔记——数学计算与数据处理

    Maple学习笔记--数学计算与数据处理 数据计算 多项式相关: 求解方程.不等式 矩阵计算.线性代数: 微积分 多变量和向量微积分 优化 概率与统计 数据处理 导入数据 数据计算 多项式相关: 1. ...

  3. matlab bwmorph spur,matlab图像处理学习笔记-数学形态与二值图像操作

    matlab图像处理学习笔记-数学形态与二值图像操作 数学形态学主要处理的是二值图像,因为二值图像的处理操作比较简单. 9.1 数学形态学图像处理 基本思想:利用一个称作结构元素(structurin ...

  4. 入门数学(二)素数,质因数分解

    素数筛选 "埃式筛法" 具体步骤:引用百度百科 求25以内的所有素数 列出2以后的所有序列: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

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

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

  6. 初试牛客网PAT练习之数素数

    正式开始练习PAT,初步选择的练习平台是牛客网(http://www.nowcoder.com/),原因是虽然自己理论学习还不错,但缺乏上手经验,想先在练习平台上实验一段时间后,在正式进驻PAT官网. ...

  7. pat 乙级 1013 数素数(C++)

    题目 令 P​i表示第 i 个素数.现任给两个正整数 M≤N≤10​4,请输出 PM到 P​N的所有素数. 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔. 输出格式: 输出从 P​M到 P ...

  8. [素数拓展] 质因数的个数 [2007年清华大学计算机研究生机试真题]

    题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=22235,共有5个质因数. 输入描述: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1< ...

  9. Composite Coloring(思维 数论(筛素数 分解质因数))

    (29条消息) CodeForces - 1332B Composite Coloring(数论+构造)_Frozen_Guardian的博客-CSDN博客 (29条消息) codeforces 13 ...

最新文章

  1. 【ES6】Promise对象详解
  2. P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)
  3. vba循环通过键盘某个按键按下退出循环_51单片机按键检测--独立按键与矩阵键盘...
  4. .net core 2.0学习笔记(三):度量.net framework 迁移到.net core的工作量
  5. win10壁纸不能幻灯片放映_有个性,做不同,10分钟让你的Win10酷起来!
  6. 为什么 Facebook 活得春风得意,而人人网却半死不活?
  7. apache添加php支持
  8. BlackMamba:C2后渗透框架
  9. win10 任务管理器显示GPU占用率
  10. 简明python教程 答案1
  11. KK录像机怎么用?KK录像机使用方法介绍
  12. SOC电源管理系统PMIC
  13. java中文转英文_Java中文转换为英文拼音
  14. http状态码 200、404什么意思
  15. 微信小程序 | 自动定时结束录制
  16. 谷歌AI论文BERT双向编码器表征模型:机器阅读理解NLP基准11种最优(公号回复“谷歌BERT论文”下载彩标PDF论文)
  17. NSDate-日期类nbsp;OC——第七天(1)
  18. 用 python 来操作 docx, xlsx 格式文件(二)(使用 docx 库操作 docx 格式文件
  19. Android获取WifiMac地址
  20. 微信小程序数据的接收详解

热门文章

  1. initWithCoder: 与initWithFrame:
  2. 从表达式到函数:表面的简洁
  3. CString::GetBuffer函数作用
  4. STM32 容易烧成电源短路解决方法
  5. ESP8266的MQTT客户端搭建教程(基于NONS_SDK_v2.0)
  6. c 语言学习:基本操作,数组,字符串,指针
  7. Windows下使用IDEA+Maven搭建本地Hadoop环境
  8. 基于区块链的健康链系统设计与实现(5)区块链性能优化
  9. 以太坊节点布置(4) geth节点互联
  10. 初等数论--同余--WILSON定理