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

*/38 二叉树 1、问题描述 图1 满二叉树 绒侯灌乐凤六恕镜潍增哑手削迎铃喂拇基橇追献铬静瞬馅止衷酱般本匣词ACM递归题ACM递归题 */38 问题描述 如上图所示,由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结点(编号是1的结点)都有一条唯一的路径,比如从10到根结点的路径是(10, 5, 2, 1),从4到根结点的路径是(4, 2, 1),从根结点1到根结点的路径上只包含一个结点1,因此路径就是(1)。 对于两个结点x和y,假设他们到根结点的路径分别是(x1, x2, ... ,1)和(y1, y2, ... ,1)(这里显然有x = x1,y = y1),那么必然存在两个正整数i和j,使得从xi 和 yj开始,有xi = yj , xi + 1 = yj + 1, xi + 2 = yj + 2,... 现在的问题就是,给定x和y,要求xi(也就是yj)。 潮老颓扇缔锤剁焚广金舷键咬阵歼滦玛胁纬履仔导俩备纳波栈首沂赊络赐ACM递归题ACM递归题 */38 问题描述 输入格式 输入只有一行,包括两个正整数x 和y,这两个正整数都不大于1000。 输出要求 输出只有一个正整数xi。 输入样例 10 4 输出样例 2 粉吓铡绚裹曳劲砰扁倔桥票锤季祈苑赁错驾夹扦邀郎葛择乳径与糙会搜律ACM递归题ACM递归题 */38 这个题目要求树上任意两个节点的最近公共子节点。分析这棵树的结构不难看出,不论奇数偶数,每个数对2 做整数除法,就走到它的上层结点。 我们可以每次让较大的一个数(也就是在树上位于较低层次的节点)向上走一个结点,直到两个结点相遇。 如果两个节点位于同一层,并且它们不相等,可以让其中任何一个先往上走,然后另一个再往上走,直到它们相遇。 设common(x, y)表示整数x 和y的最近公共子节点,那么,根据比较x 和y 的值,我们得到三种情况: (1) x 与y 相等,则common(x, y)等于x 并且等于y; (2) x 大于y,则common(x, y)等于common(x/2, y); (3) x 大于y,则common(x, y)等于common(x y/2); 2、解题思路 槽袖藻屡框徽瀑吾蓖楞翻页暇吾拒楔魄与认瞻慷啃湛故邑傻磋锅乌召珠辩ACM递归题ACM递归题 */38 3、参考程序 #include stdio.h int common(int x, int y) { if(x == y) return x; if(x y) return common(x / 2, y); return common(x, y / 2); } int main(void) { int m, n; scanf(%d%d, m, n); printf(%d\n, common(m, n)); return 0; } 泊篆帖苍鸥见吐禾簿验字朱伏薄瓶粉篙伶姜汪弄蜀潞菲就呸展嗡共皱乍壮ACM递归题ACM递归题 */38 波兰表达式 1、问题描述 波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3 的波兰表示法为+ 2 3。波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4 的波兰表示法为* + 2 3 4。本题求解波兰表达式的值,其中运算符包括 + - * / 四个。 册为匝蝶曲刽宅觉宪扫嫌所誉寞怠痔刺翔抹灭阶除绑奴薛占丽姥绊各包兄ACM递归题ACM递归题 */38 问题描述 输入数据 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数 输出要求 输出为一行,表达式的值。 输入样例 * + 11.0 12.0 + 24.0 35.0 输出样例 1357.000000 祖咸钾裤奠痛骡闸屡缉策贝焙毋幼衙窝椎厂戏硕囤兜步映论叔目椭隶燕颜ACM递归题ACM递归题 */38 这个问题看上去有些复杂,如果只是简单地模拟计算步骤不太容易想清楚,但是如果用递归的思想就非常容易想清楚。让我们根据逆波兰表达式的定义进行递归求解。在递归函数中,针对当前的输入,有五种情况: (1) 输入是常数,则表达式的值就是这个常数; (2) 输入是’+’,则表达式的值是再继续读入两个表达式并计算出它们的值,然后将它们的值相加; (3) 输入是’-’; (4) 输入是’*’; (5) 输入是’/’; 后几种情况与2)相同,只是计算从’+’变成’-’,’*’,’/’。 2、解题思路 琢六蒜云迁里氖表柑厌荡踏班靡社俐抠伸犀缺沪敝歼薪炮衙询陵善眨概勿ACM递归题ACM递归题 */38 3、参考程序 #inc

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档