- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基本算法讲座之数学篇
数学类的基本算法大多数属于初等数论范畴,相当大一部分与素数有直接关系,因此素数是一个很基本又很重要的内容。 我们先来看看怎么判断一个数是否素数。素数的定义为:如果一个数的正因子只有1和这个数本身,那么这个数就是素数。根据定义,我们立即能得到判断一个数N(大于1)是否素数的简单的算法:枚举2到N-1之间的整数,判断是否能整除N。
小范围内判断一个数是否为质数:function prime (n: integer): Boolean;var I: integer;begin for I:=2 to trunc(sqrt(n)) do if n mod I=0 then begin prime:=false; exit; end; prime:=true;end; 如果n很大,那么上面的程序就要运行比较长的一段时间,那么有没有更快一点的算法呢?回答是肯定的!因为如果n含有不为1和自身的因子,那么这些因子中必定有不大于sqrt(n)的(假设n有因子p,1pn,如果p=sqrt(n),那么p就不大于sqrt(n),如果psqrt(n),那么n/p也是n的因子,而且1n/pn,所以n/p不大于sqrt(n))。于是我们可以改进上面的程序,得到另外一个?Pascal?程序。容易知道这个算法的时间复杂度为O(sqrt(n))。
? 判断longint范围内素数(求50000内素数)longint范围内program primes;
const
x=50000;
var
pr:array[1..x] of longint;
k,s:longint;
procedure getprime;
var
i,j:longint;
p:array[1..x] of boolean;
begin
fillchar(p,sizeof(p),true);
p[1]:=false;
i:=2;
while ix do begin
if p[i] then begin
j:=i*2;
while jx do begin
p[j]:=false;
inc(j,i);
end;
end;
inc(i);
end;
s:=0;
for i:=1 to x do
if p[i] then begin
inc(s);pr[s]:=i;
end;
end;{getprime}
{
function prime(x:longint):boolean;
var i:integer;
begin
prime:=false;
for i:=1 to s do
if pr[i]=x then break
else if x mod pr[i]=0 then exit;
prime:=true;
end
}
begin
getprime;
writeln(l);
end.
(2)因式分解?? 因式分解的算法很简单,模拟手工分解的过程,我们得到分解n的算法:枚举所有不大于n的所有素数,判断这些素数能整除n多少次。判断2到n是否素数,总共要计算sqrt(2)+sqrt(3)+sqrt(4)…+sqrt(n)=n*sqrt(n)次,因此算法的时间复杂度可以粗略地认为是O(n*sqrt(n))。事实上,我们有更好的算法。先看一个显而易见的结论:如果p是能整除n的所有大于1的数中最小的,那么p是n的一个素因子。基于这样一个结论,我们得到?Pascal?代码。? ? (3)公因子的数量?? 问题描述:已知一个正整数N,问这个数有多少正公因子。 算法分析:最容易想到的算法是:枚举1..N,看看有多少个数能整除N,这种算法的复杂度为O(?N?)。可以优化一下:如果N有小于SQRT(?N?)的因子X,那么N必定有大于SQRT(?N?)的因子Y与X对应,而且XY=N。所以我们只需要枚举1..SQRT(?N?)的数即可,还要考虑N为完全平方数的特殊情况。程序:Pascal。上面这个算法的复杂度为O(sqrt(N))。其实我们可以利用因式分解的方法来做。假设我们已经分解N得到?N?=(p[1]^s[1])*(p[2]^s[2])...*(p[pnum]^s[pnum]),其中p[i]为互不相同的素数,那么N的正因子的数量为(具体怎么推导请参考组合数学教材中的母函数一章):(s[1]+1)*(s[2]+1)*…*(s[pnum]+1)。? ? (4)最大公约数?? 问题
您可能关注的文档
最近下载
- 世界现代化的历程.pptx VIP
- 商务秘书公司地址托管协议范本2025年通用.docx VIP
- 前门西河沿街景观及建筑外立面改造方案设计.pdf
- 光纤传感器和刮板输送机直线度感知系统及其测量方法.pdf VIP
- (完整版)2025标准对数视力表(A4打印版) .pdf VIP
- 初一数学下册期末试卷初一数学下试卷期末.docx VIP
- 小学二年级学习资料 【57】二年级上册语文全册一课一练.pdf VIP
- 共建·共享:初中整本书阅读课程区域推进的实践探索.ppt VIP
- Unit 3 Places we live in第四课时 课件2025-2026学年度人教PEP英语四年级上册.pptx VIP
- 在教育中修行,带着温暖追光——读《教育是一场温暖的修行》有感.docx
文档评论(0)