埃及分数问题.pptVIP

  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文档。上传文档
查看更多
埃及分数问题 N080320064 黄思明 描述一 : 题目讲解 ? 在古埃及,人们使用单位分数的和 ( 形如 1/a 的, a 是自然数 ) 表示一切有理数。 ? 如: 2/3=1/2+1/6, 但 不允许 2/3=1/3+1/3, 因为 加数中有相同的 。 ? 对于一个分数 a/b, 表示方法有很多种,但是哪 种最好呢? 首先,加数少的比加数多的好, 其次,加数个数相同的,最小的分数越大越 好,如果最小分数相同,依次类推 。 描述二:举例分析: 如: 19/45=1/3 + 1/12 + 1/180 19/45=1/3 + 1/15 + 1/45 19/45=1/3 + 1/18 + 1/30 19/45=1/4 + 1/6 + 1/180 19/45=1/5 + 1/6 + 1/18 最好的是最后一种(选择): 因为 1/18 比 1/180,1/45,1/30,1/180 都大。 编程任务 ? 对于给定的 真分数 ,设计一个算法,找到用 最好埃及分数表示真分数的表达式。 输入输出 输入: 由文件 input.txt 给出输入数据。文件中仅一行,包括两 个整数 a 和 b ,它们之间用空格分开,分别表示分数的分子和 分母。 输出: 用最好的埃及分数表示法来表示分数中的分母, 从小到 大 依次输出到文件 output.txt 。 输入实例文件 输出实例文件 Input.txt output.txt 19 45 5 6 18 算法分析一:总体思想 这是比较典型的分支界限搜索问题,利用 “回溯”思想,搜索出问题的解。 问题要求,需要采用的分数最少。所以, 可以采用迭代加深 (DFID) 的方法( n 表示符合 题目需要的单位分数的个数): 让 n 从 1 开始逐渐迭代加深 ? 1 , 2…… 当通过搜索得到一个解时,则此时得到的 n 一定可以满足个数最小这要求;然后继续枚 举个数为 n 的解,比较,最后得出最优解。 算法分析二:搜索 --- 剪枝 ? 定义: n 为需要的单位分数个数 m 表示当前正在搜索第 m 个分数( m 从 1-n ) midst[m] 存储当前搜索得到的第 m 个分数的分母 a/b 为题目输入的真分数 x/y = a/b - 1/midst[1]- ……1/midst[m -1] ( 当搜索第 m 个分数时); 本题目,采用的剪枝方法 — 界定搜索的上下限 算法分析二:搜索 --- 剪枝 ? 下界限定 : 1. 搜索第 m 个分数时候,该分母一定要比得到的前一 个分母大,所以下界定义为 :midst[m-1]+1 ; 2. 补充 ? 由于 1/midst[m] 必须 =x/y ,所以, midst[m]=y/x ; Then midst[m] = max(y/x, midst[m-1] + 1) ; ? 上界限定 : 由于 midst[] 随着 m 的增大也增大, 1/midst[m] 变得越 来越小,故:要求的解, 1/midst[m] 一定要大于 x/(y*(n-m+1)) ;所以上上界定义为: y*(n-m+1)/x 算法分析三:判断条件 ? 1. 搜索第 m 个分数时,要判断 midst[m] 是否满 足: y/x 1/midst[m]; 否则, midst[m] 必须自 加,直到满足。 ? 2. 当 m==n 时,判断是否 y 可以整除 x ?;并且 判断: yx*midst[n-1] ?( 目的,防止出现两 个相同的分母) ? 3. 当得到一个解,要和已存的解进行判断, 获取最优解。依次下来,直到搜索完毕。 程序分析 ? void calcute(int x, int y, int m, int n) ? { ? int i, j, k; ? if(m == n) //m==n 的情况分析 ? { ? if (y % x == 0 y x * midst[n -1]) // 判断 2 ? { ? midst[n] = y/x; ? judge = 1 // 控制变量,找到解, n 不会加深 ? k = n; ? while(true) // 判断 3 ,找出最优解 ? { ? if(midst[k] final[k]) ? break; ? if(midst[k] == final[k]) ? { ? k--; ? continue; ? } ? if(midst[k] final[k]) ? { ? for(i = 1; i = n; i++) ? { ? final[i] = midst[i]; ? }

文档评论(0)

jinzhuang + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档