算法.docx
- 文档编号:11093840
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:9
- 大小:19.19KB
算法.docx
《算法.docx》由会员分享,可在线阅读,更多相关《算法.docx(9页珍藏版)》请在冰豆网上搜索。
算法
同学们,你们经常接触到电脑。
用电脑打字,看电影。
玩游戏。
甚至电脑棋手下赢过国际著名棋手,在电脑上能做很多我们喜欢做的事情,我们在大赞电脑本身神奇的时候,想下那是不是电脑本身就是那么神奇的呢?
不是的,其实电脑最起初只有物理上的放电断电的两个动作。
也就是说电脑只懂得机器语言也就是0(代表断电)1(代表放电)两个字符。
后来由于人的不断发展计算机语言,从机器语言到汇编语言,发展到现在的高级语言(我们现在经常能看到的很多程序都是用C语言编写的。
)话虽然说是高级语言,但是它也只能机械式地按照某种确定的步骤行事通过一系列小的简单计算操作完成复杂计算的过程,而这个解决某一个问题而采取的方法和步骤,称为算法.或者说算法是解决一个问题的方法的精确描述。
也就是说算法是计算机程序运行的核心。
广义地说:
为了解决某一问题而采取的方法和步骤,就称之为算法。
现在我们来看看几个例子。
1、游戏程序。
以24点游戏为例子
#include
#include
#include
#include
charsig[4]={'+','-','*','/'};
voidfun(floatn[],charch[][50],intm)
{
intx[2],y,i,j;
floatnum[4];
charcc[4][50];
if(m==1)
{
if(fabs(n[0]-24.0)<0.0001)
{
printf("\n%s=24",ch[0]);
getch();
exit(0);
}
}
else
{
for(x[0]=0;x[0] { for(x[1]=0;x[1] { if(x[1]==x[0])continue; for(y=0;y<4;y++) { switch(y) { case0: num[0]=n[x[0]]+n[x[1]];break; case1: num[0]=n[x[0]]-n[x[1]];break; case2: num[0]=n[x[0]]*n[x[1]];break; case3: if(n[x[1]]==0)break; num[0]=n[x[0]]/n[x[1]];break; default: break; } if(y! =3||n[x[1]]! =0) sprintf(cc[0],"(%s%c%s)",ch[x[0]],sig[y],ch[x[1]]); for(i=0,j=1;i if(i! =x[0]&&i! =x[1]) { num[j]=n[i]; strcpy(cc[j],ch[i]); j++; } fun(num,cc,m-1); } } } } } /***********************/ main() { floatnum[4]; inti; charcx[4][50]; clrscr(); printf("Pleaseinput4integers: "); for(i=0;i<4;i++) scanf("%f",&num[i]); for(i=0;i<4;i++) { sprintf(cx[i],"%d",(int)num[i]); } fun(num,cx,4); printf("noanswer! "); getch(); } 2、解决物理问题。 题目: 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米? 第10次反弹多高? 3、1.程序分析: 见下面注释 4、2.程序源代码: main() { floatsn=100.0,hn=sn/2; intn; for(n=2;n<=10;n++) { sn=sn+2*hn;/*第n次落地时共经过的米数*/ hn=hn/2;/*第n次反跳高度*/ } printf("thetotalofroadis%f\n",sn); printf("thetenthis%fmeter\n",hn); getch() } 3、数学算法。 题目: 将一个正整数分解质因数。 例如: 输入90,打印出90=2*3*3*5。 程序分析: 对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n, 重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 2.程序源代码: /*zhengintisdividedyinshu*/ main() { intn,i; printf("\npleaseinputanumber: \n"); scanf("%d",&n); printf("%d=",n); for(i=2;i<=n;i++) { while(n! =i) { if(n%i==0) {printf("%d*",i); n=n/i; } else break; } } printf("%d",n); getch(); } 问题: 电脑与人脑的思维方式有什么不同? 为什么要学习算法? 我的思路: 电脑运算的高速度和超强的记忆能力是人脑无法比拟的,但人脑能够推理、归纳、判断、分析、计算……这些电脑都不会,电脑只会算术运算与逻辑运算.要让电脑为我们做事,就要把我们的意图转成电脑能懂的语法,这就需要算法设计.计算机解题的核心是算法设计。 将来你们有些人是要走上计算机程序员的岗位,那样必定要求你们精通算法,同样,不是做这些职业的人也一定要明白算法的设计来,因为算法不仅仅只的是计算机上的程序运行步骤,还是达成任何目的的合理的做法设计。 4、实际问题 一个人带三只狼和三只羚羊过河.只有一条船,同船可以容一个人和两只动物.没有人在的时候,如果狼的数量不少于羚羊的数量,狼就会吃掉羚羊. (1)设计安全渡河的算法; (2)思考每一步算法所遵循的相同原则是什么. 解析: (1)S1 人带两只狼过河. S2 人自己返回. S3 人带两只羚羊过河. S4 人带一只狼返回. S5 人带一只羚羊过河. S6 人自己返回. S7 人带两只狼过河. (2)在人运送动物过河的过程中,人离开岸边时必须保证每个岸边的羚羊数目要大于狼的数目. 点评: 这是一个实际问题,生活中解决任何问题都需要算法,我们要在处理实际问题的过程中理解算法的含义,体会算法设计的思想方法. 问题1: 两个大人和两个小孩一起渡河,渡口只有一条小船,每次只能渡1个大人或两个小孩,他们四人都会划船,但都不会游泳.同学们现在想一想,他们怎样渡过河去? 请写一写你的渡河方案. 我的思路: 因为一次只能渡过一个大人,而船还要回来渡其他人,所以只能让两个小孩先过河,渡河的方法与步骤为 第一步 两个小孩同船渡过河去; 第二步 一个小孩划船回来; 第三步 一个大人独自划船渡过河去; 第四步 对岸的小孩划船回来; 第五步 两个小孩再同船渡过河去; 第六步 一个小孩划船回来; 第七步 余下的一个大人独自划船渡过河去; 第八步 对岸的小孩划船回来; 第九步 两个小孩再同船渡过河去. “鸡兔同笼”是我国隋朝时期的数学著作《孙子算经》中的一个有趣而具有深远影响的题目: “今有雉兔同笼,上有三十五头,下有九十四足.问雉兔各几何.” 用方程组的思想不难解决这一问题,请你设计一个这类问题的通用算法. 答案: 解析: 鸡兔同笼,设鸡兔总头数为H,总脚数为F,求鸡兔各有多少只.算法如下: 第一步 输入总头数H,总脚数F; 第二步 计算鸡的个数x=(4 H-F)/2; 第三步 计算兔的个数y=(F-2 H)/2; 第四步 输出x,y. 一个算法应具有以下五个重要特征: (1)有穷性: 一个算法必须保证执行有限步之后结束; (2)确切性: 算法的每一步骤必须有确切定义; (3)可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次即可完成; (4)输入: 一个算法有0个或多个输入,以刻划运算对象的初始条件.所谓0个输入是指算法本身定出了初始条件; (5)输出: 一个算法有1个或多个输出,以反映对输入数据加工后的结果.没有输出的算法是毫无意义的. 课时小结 要正确地设计一个算法就需要掌握算法的五个特性: ①有穷性,算法中执行的步骤总是有限次数的,不能无休止地执行下去. ②确切性,算法中的每一步操作的内容和顺序必须含义确切,不能有二义性. ③可行性,算法中的每一步操作都必须是可执行的,也就是说算法中的每一步都能通过手工和机器在有限时间内完成,这称之为有效性. ④输入,一个算法中有零个或多个输入.这些输入数据应在算法操作前提供. ⑤输出,一个算法中有一个或多个输出.算法的目的是用来解决一个给定的问题,因此,它应向人们提供产生的结果,否则,就没有意义了 同时还要注意算法的优化性。 .
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法