网站大量收购独家精品文档,联系QQ:2885784924

埃及分数问题.ppt

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
埃及分数问题

埃及分数问题 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]; } break; } }

文档评论(0)

153****9595 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档