您好,欢迎来到星星旅游。
搜索
您的当前位置:首页“百钱买百鸡”问题的C语言算法分析

“百钱买百鸡”问题的C语言算法分析

来源:星星旅游
2第20卷第3期 017年3月 软件工程SOFTWARE ENGINEERING 、b1.20 No.3 Mar.2017 文章编号:2096-1472(2017)-03-24—02 “百钱买百鸡”问题的c语言算法分析 龙敏敏 (衡阳市广播电视大学,湖南衡阳421001) 摘 要:C语言是使用时间最久和最普及的计算机高级程序设计语言之一,属于面向过程的程序设计语言,兼有汇 编语言和高级语言的双重特点,是人们学习计算机程序设计的首选语言,也是学习其他计算机课程和进行软件开发的基 础。C语言程序设计中的循环语句是C语言的一个难点,可以用来解决许多具有规律性重复操作的实际问题,文章通过 对“百钱买百鸡”这个问题的算法进行设计、分析和优化,以寻求解决问题的最优算法。 关键词:C语言;循环语句;百钱买百鸡 中图分类号:TP311.1 文献标识码:A An Analysis of the Algorithm for”Spending 100 Dollars on 100 Chickens”in C Programming Language LONG Minmin (HengyangRadio&TVUniversity,Hengyang421001,China) Abstract:As a process-oriented programming language,C programming language is one ofthe most classic and popular computer programming lnaguages with the characteristics of the assembly language and the high—level language.It is not only the first choice for the people who begin to learn computer programming,but also the basis for other computer courses nad software development.As a diifcult point in C Programming Language learning,the loop statement can be used to solve many practical problems of regularly repetitive operation.Taking the case of”spending 100 dollars on 100 chickens",the paper implements design,naalysis and optimization,and ifnally proposes the optimal algorithm. Keywords:C programming language;loop statement;spending 100 dollars on 100 chickens l引言(Introduction) 它们可以解决实际应用中需要重复处理和计算的问题 ’ 。例 计算机算法设计是计算机专业学习的核心专业内容,算 如,计算l到100之间的整数的和,就需要重复地做加法;求 法设计对于培养一个人的逻辑思维能力具有重要的作用,能 数组中的最大值,需要重复地进行两个数据的比较;求素数 进行有效的算法设计是对一个计算机学者的基本要求。求解 问题,需要依次对每个整数进行判断;求百钱买百鸡问题, 同一个问题的算法可能有多种,进行算法设计的优劣往往在 需要依次穷举每个可能的值通过计算来进行判断;求水仙花 一定程度上体现出设计者的计算机应用能力,所以,我们要 问题,需要对范围内的整数依次进行计算判断等等。对于这 学会如何对一个算法进行分析并进行优化“’ 。一个算法不一 些复杂的问题,使用循环语句来解决效率很高,下面我们通 定能说它是最优的,我们所说的最优算法是指在某一种衡量 过“百钱买百鸡”这个经典问题来进行分析。 标准下,优于解决该问题的所有可能的算法。一般地,解决 3“百钱买百鸡”问题描述(The problem description 某个问题的最优算法是指在时间复杂度的基础上的最优性, of”spending 100 dollars on 100 chickens”1 时间复杂度是指算法执行的时间长短,通过把算法的核心操 中国古代数学家张丘建在他的 算经 中提出了著名的 作执行的次数作为算法的时间度量 】,这里,我们使用c语言 “百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三, 的循环语句解决“百钱买百鸡问题”,基于算法中的循环次 鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何? 数来判断算法的优劣 j。 这是一个古典数学问题,买一只公鸡值5钱,一只母鸡 2 C语言循环语句(C language loop statement) 值3钱,三只小鸡值1钱,问如果用100钱买1o0只鸡,那么公 C语言是一种广泛使用的程序设计语言,它具有功能丰 鸡、母鸡和小鸡分别多少只?我们假设公鸡、母鸡和小鸡的 富、使用灵活、目标程序效率高等特点 。C语言是用流程 个数分别为a、b、C,那么买公鸡的钱数为5*a,买母鸡的钱 控制语句来控制程序的执行流程,流程控制语句包括顺序结 数为3*b,买小鸡的钱数为c/3;并且a、b、c2;和为100, 构、选择结构和循环结构三类,C语言中的循环语句又包括 a,b,c都是正整数且C是3的倍数,该问题用数学中的三元一次 for循环语句、while循环语句和do…while循环语句三种,用 方程组表达如下: ’ 第20卷第3期 龙敏敏: “百钱买百鸡”问题的c语言算法分析 printf(”公鸡=%d,母鸡=%d,小鸡=%d\n”,a,b,c);} } ++。:a +3+c 5b/3=l。。 。。此时我们再来计算一下以上算法需要执行的循环次数为 4算法设计与分析(Algorithm design and analysis) 19.33.33=20691次,很明显,此时算法的执行效率有了一定 对于上述列出的三元一次方程,最直观的方法就是采用 语句进行算法设计,得出算法一如下: main(){ 的提高,缩小小鸡C的取值范围使得算法的循环次数变为上个 法吗?还有没有进一步改进的空间呢?答案是肯定的。其实 只要我们再仔细观察可以发现,这个算法实际上可以不用三 重循环,而只用二重循环就可以达到目的,因为二重循环比 三重循环会大大降低循环次数,因而提高执行速度。由于公 三重循环来解决,我们对a、b、c的范围进行限定,用for循环 算法的三分之一。那么这一次改进后的算法就是最理想的算 for(b=1 lb<=lO0Ib++) 鸡a和母鸡b的数量确定后,其实小鸡C的数量也就等于确定 了,即c=100一a-b,从而就不需要再进行加一重循环了,此 for(c=1,c<=lO0;c+十){ if((5{a+3女b+c/3==1O0)&&(a+b+c==1O0)&&(c%3==0)) printf(”公鸡=%d,母鸡=%d,小鸡=%d\n”,a,b,C)I} } 程序运行结果如下: 时又可以去掉a+b+c=lO0这个约束条件,得到算法四如下: main(){ int a,b,C} for(a=l;a<=19la++) for(b=1;b<=33 Ib++) {c=lO0-a-b; if((5十a+3}b+c/3=:10O)&&(c%3==0)) printf(”公鸡=%d,母鸡=%d,小鸡=%d\n”,a,b,C);} } 以上算法的循环次数只有19.33=627次,相对上个算法又 大幅度提高了算法的执行效率。我们尝试再进行进一步的分 析: 我们可以进一步分析出公鸡、母鸡和小鸡的更小范围, 公鸡=4,母鸡=8,小鸡=78 公鸡=8,母鸡=l1,小鸡=81 公鸡=12,母鸡=4,小鸡=84 该算法直接将三元一次方程转化为C语言三重循环程序, 没有进一步考虑a、b、c更小的取值范围,所以导致循环次数 为100.100.100=10 ,算法的复杂度太高,所以我们可以根据 每种鸡的价钱先确定a、b,c的取值范围:公鸡为5钱,所以a 的取值范围为1—20,当然a的取值的不可能是20,否则100钱 刚好买2O只公鸡与百鸡的题意不符;b的取值范围为1—33,c 根据一只公鸡5钱,一只母鸡3钱,三只小鸡l钱,得知,若a 的取值范围为3—99;得到算法二如下: main(){ 的值为15时,公鸡的总钱为75钱,剩下的25钱最多可买75只 小鸡,达不到百鸡数量的要求,所以公鸡a的值必定小于15, aM大致范围是l一14;若b的值为25时,母鸡的总钱为75钱, 剩下的25钱最多可买75只小鸡,刚好达到百鸡的数量,所以b 的值不会超过25,b的大致取值范围为1—25 I由于a、b的最 for(c=3;c<=99;c++){ 大值分别为14和25,那么要满足百鸡数量的话,c的最小值至 少应是61,又当C的值为90只时,小鸡的总钱才30钱,剩下10 只即使都买公鸡也只50钱,总钱达不到百钱的要求,所以C的 值肯定是小于90,又C是3的倍数,所以大致估算C的取值范围 为63—87。既然a、b、c的大致范围都确定了,我们可以得到 下列算法五: if((5}a+3}b+c/3==100)&&(a+b+c==100)&&(c%3:=0)) pIqntf(”公鸡=%d,母鸡=%d,小鸡=%d\n”,a,b,c);} } 对于这个算法我们可以计算一下它的循环次数为 l9+33*97=608190:,可见算法的效率还是不高。那么我们 还能不能再进行一定的改进呢?通过分析,买小鸡的钱数为 c/3,那么小鸡的数量c是3的倍数,所以为了提高执行效率, 我们可以把对小鸡的for循环语句中C的步长值设为3,这样可 以减少一定的循环次数,也可以去掉c%3==0这个约束条件, main(){ int a,b,CI for(a=l;a<=14;a++) for(c=63{c<=87}c+=3) {b=lO0一a—c; 得到算法三如下: main(){ if(5*a+3*b+c/3==100、 prinff(”公鸡=%d,母鸡=%d,小鸡=%dXn”,a,b,C);} } 以上算法循环语句执行的次数仅为14.9=126次,这大大 for(c=3,c<=99 l c+=3){ lf((5*a+3 b+c/3==100)&&(a+b+c==100)) 提高了算法的执行速度。这个算法是先确定公鸡a和小鸡c的 (下转第17页) 第2O卷第3期 秦晓晖:基于协同过滤的个性化微博推荐算法研究 User—Item Matrix:A Survey of出e State of the Art and Future Knowledge,2008:426—434. Challenges[J].ACM Computing Surveys(CSUR),2014,47(1):3. 【7】Rendle s.The IEEE International Conference on Data 【2】Yang X,et a1.A Survey of Collaborative Filtering Based Social Mining[C].Factorization machines,2010:995—1000. Recommender Systems[I】.Computer Communications, [8]Cao Y.,et a1.Adapting Ranking SVM to Document 2014,41:1—10. Retrieval[C】.The 29th Annual Internationa1 SIGIR 【3】Levy O,Goldberg Y.Neurla Word Embedding as Implicit Matrix Conference,2006:186-193. Factorization【C】.Advances in Neural Information Processing 【9】孙立伟,何国辉,吴礼发.网络爬虫技术的研究U】.电脑知识与 Systems,2014:2177—2185. 技术,2010,6(15):41 12-41 15. 【4]Sarwar B.,et a1.Item—Based Collaborative Filtering [10】高建煌.个性化推荐系统技术与成用[D】.中国科学技术大 Recommendation Algorithms[A].Hypermedia Track of the 10th 学,2010. International World Wide Web Conference.2001:285—295. [11】Chen K.,et a1.CollabOrative Personalized Tweet [5】Shi Y.,Larson M.,Hanjalic A.Exploiting User Similarity Based Recommendation[A].The 35th International ACM SIGIR on Rated——Item Pools for Improved User——Based Collaborative Conference on Research and Development in Information Filtering[A】.Third ACM Conference on Recommender Retrieval,2012:661-670. Systems,2009:125—132. 作者简介: 【6】Koren Y.Factorization Meets the Neighborhood:a 秦晓晖(1987-),女,硕士,助教.研究领域:中文信息处理, Muhifaceted Collaborative Filtering Model[A】.The 人工智能. 1 4th ACM SIGKDD Interna ciOna】COnferenCe on (上接第25页) 数量,然后就可以确定母鸡b的数量(b=lOO-a-c);当然,我们 断地对已有算法设计进行改进和优化的精神。当然,该问题 也可以先确定母鸡b和小鸡C的数量,再确定公鸡a的数量,此 的解决方法不止于此,必定还会有一些更优的算法值得我们 时所使用的二重循环语句是: 去探索。 for(b=l Ib<=25 lb++) 参考文献(References) for(c=63 l c<=87 l c+=3) 【1]Fathima H.,Musthafa A.Syed.Optimization Based Routing {a=100-b-c; Algorithms[J].International Journal of Applied Research on if(5 a+3}b+c/3==l00) Information Technology and Computing,2014,5(1):55—70. printf(”公鸡=%d,母鸡=%d,小鸡=%d\n”,a,b,c);} 【2】Guang—Yu zhu,Wei—BOzhang.OPtimal Foraging 也可以先确定公鸡a和母鸡b的数量,再确定小鸡C的数 Algorithm for Global OptimizationU].Applied Soft 量,此时所使用的二重循环语句是: Computing,2017,51:294—313. for(a=1;a<=14,a++) [3】R.VenkataRao,G.G.Waghmare.A New Optimizaiton lAgorithm for(b=1 lb<=25 Ib++) . for Solving Complex Constrained Design Optimization {c=100一a—bl ProblemsJ[].Engineering Optimization,2017,49(1):60—83. if((5十a+3 b+c/3==loo)&&(c%3==0)) [4】黄隆华,陈志辉.算法设计与分析课程的“百钱买百鸡问题” printf(”公鸡=%d,母鸡:%d,小鸡=%dXn”,a,b,c)l} 趣用 计算机教育,2016(3):143—145. 根据对算法五的三种情况进行对比可以发现,情况一的 【5】耿国华.算法设计与分析【M】.北京:高等教育出版社,2012(1): 执行次数为126,情况二的执行次数为25*9=225,情况三的执 20—2 2_ . 行次数为14.25=350,显然选择取值范围小的两个变量作为循 【6】许桂平.浅析c ̄-- ̄三种循环结构语句L-『】.考试周刊,2014 环变量来构造二重循环是比较合理的,当然这三种情况的算 (21):117—118. 法执行效率都要优于前面的算法。 【7】任爱华.c语言程序设计【M].北京:中央广播电视大学出版 5结论(Conclusion) 社.20i5:66—95. 以上五个算法是应用多重循环语句对“百钱买百鸡”问 f8】马学敏.计算机c语言循环语句的应用研究U].中国新通信, 题的算法分析,由差到优循序渐进地对算法进行了改进,通 2016(17):87—88. 过每一次的改进降低了算法的执行时间,从最初的10 次的循 作者简介: 环执行次数降到了最后的126次,最终得到了最为理想的算 龙敏敏(1979--),女,本科,讲师.研究领域:计算机应用技 法。所以,我们在进行算法设计时,不应该只是得出了正确 术,计算机教育教学. 的算法就可以了,而是要尽量去寻找最优的算法,要具有不 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- stra.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务