- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
形势任务讲解1
题目讲解 1.筛素数 2.排列的递推 筛素数 给定一个x求,1-x内的素数个数 简单的素数判定 bool isPrime(int x) { bool flag=true; for (int i=2;i=int(sqrt(x));++i) If (x % i==0) { flag=false; break; } return flag; } 改进的方法 Miller-Rabbin素数测试 有兴趣的同学可以把《数论讲义》的最后一部分看一下 Eratosthenes筛法 名字很长,其实很简单。 见《数论讲义》P12页 基本思想,用一个bool数组p[i]来表示i是否为素数,然后用1-sqrt(x)内的素数依次把其中不是素数的部分筛掉 程序实现 bool p[100000001];//经典错误 int getprime(int x) { for (int i=2;i=x;++i) p[i]=true; for (int i=2;i=int(sqrt(x));++i) if (p[i]) { int temp=i*i; while (temp=x) { p[temp]=false; temp+=i; } } int ans=0; for (int i=2;i=x;++i) ans+=p[i]; Return ans; } 有没有更快的方法呢? 有!! 就在我们身边!! 排列的递推 给定一个由0-9组成的排列,求出字典序中比他大k的排列。 0321456789 1 0321456798 0321456789 2 0321456879 直接递推 其后k个,相当于我们做k次寻找其后一个的过程。 cins k; for (int i=0;ik;++i) s=next(s); 如何找其后面一个 0254398761? 0254613789 0254398761 – 0254698731 – 0254698731 – 0254613789 从后向前,找到第一个减小的数,然后从后往前,找到第一个比他大的数,交换位置,然后将后面这一段翻转 另一种方法 利用组合数学知识 将排列s对应的序号直接计算出来,加上k,再计算出对应的排列 基本思想:考虑7364521980,那么以 0-6开头的,有7*9!个,然后,以70-72开头的,有3*8!个……依次类推! 实际编程中第一种方法的实现 #includealgorithm using namespace std; next_permutation(a, a+n); 求a[0]~a[n-1]的下一个排列 就这么简单! 第三次作业 用《离散数学》上介绍的Dijkstra算法计算最短路径长度。 输入方式: 6 9 //点数n和边数m,接下来有m行 N=100,m=N^2 点的编号为1-n 1 2 1 1 3 4 2 3 2 2 4 4 2 5 5 3 5 1 4 5 3 4 6 2 5 6 6 每一行a、b、c 表示点a和b之间有一条长度为c的无向边。 保证是简单图。 即《离散数学》p171,图10.5.1 输出起点(1)到每个点的距离 输出格式 样例输出: 1 3 4 5 7 第i行,表示点1到点i+1的最短路径长度
文档评论(0)