数学篇【信息技术】.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)最大公约数?? 问题

文档评论(0)

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档