版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、3 33 3 算法优化基本技巧算法优化基本技巧3 33 31 1 算术运算的妙用算术运算的妙用3 33 32 2 标志量的妙用标志量的妙用333 信息数字化信息数字化3.3.1 3.3.1 算术运算的妙用算术运算的妙用 有关算术运算的妙用,在前面的许多例题中已有体现。有关算术运算的妙用,在前面的许多例题中已有体现。如:上一节如:上一节321“原始信息与处理结果的巧妙对应原始信息与处理结果的巧妙对应”中的例中的例2 2,通过算术运算把数据信息归类后与下标对应。,通过算术运算把数据信息归类后与下标对应。 总之,通过恰当的算术运算可以很好地提高编程效率,总之,通过恰当的算术运算可以很好地提高编程效率
2、,以及相关算法的运行效率。值得认真总结学习。以及相关算法的运行效率。值得认真总结学习。【例【例1 1】一次考试,共考了五门课。统计五十个学生中至】一次考试,共考了五门课。统计五十个学生中至 少有三门课成绩高于少有三门课成绩高于9090分的人数。分的人数。 问题分析:若一个学生五门课的成绩分别记为:问题分析:若一个学生五门课的成绩分别记为:a1,a2,a3,a4,a5a1,a2,a3,a4,a5,则要表示有三门课成绩高于,则要表示有三门课成绩高于9090分,有分,有C C3 35 5=10=10组关系逻辑表达式,每组三个关系表达式。无论书写还是运组关系逻辑表达式,每组三个关系表达式。无论书写还是
3、运行效率都极低。但通过算法运算就能很简便地解决这类问题。行效率都极低。但通过算法运算就能很简便地解决这类问题。 算法设计:算法设计:1 1)对每个同学,先计算其成绩高于)对每个同学,先计算其成绩高于9090分的课程数目,若超过分的课程数目,若超过3 3,则累加满足条件的人数中。则累加满足条件的人数中。2 2)用二重循环实现以上过程,外层循环模拟)用二重循环实现以上过程,外层循环模拟5050个同学,内层循个同学,内层循环模拟五门课程。环模拟五门课程。【例【例2 2】开灯问题:有从】开灯问题:有从1 1到到n n依次编号的依次编号的n n个同学和个同学和n n 盏灯。盏灯。1 1号号同学将所有的灯
4、都关掉;同学将所有的灯都关掉;2 2号同学将编号为号同学将编号为2 2的倍数的灯都打开;的倍数的灯都打开;3 3号同学则将编号为号同学则将编号为3 3的倍数的灯作相反处理(该号灯如打开的,的倍数的灯作相反处理(该号灯如打开的,则关掉;如关闭的,则打开);以后的同学都将自己编号的倍则关掉;如关闭的,则打开);以后的同学都将自己编号的倍数的灯,作相反处理。问经数的灯,作相反处理。问经n n个同学操作后,哪些灯是打开的?个同学操作后,哪些灯是打开的?问题分析:问题分析:1 1)用数组表示某种状态,这里定义有)用数组表示某种状态,这里定义有n n个元素的个元素的a a数组,它数组,它 的每个下标变量的
5、每个下标变量aiai视为一灯,视为一灯,i i表示其编号。表示其编号。ai=1ai=1 表示灯处于打开状态,表示灯处于打开状态,ai=0ai=0表示灯处于关闭状态。表示灯处于关闭状态。2 2)实现将第)实现将第i i 灯作相反处理的操作,可以用条件语句灯作相反处理的操作,可以用条件语句ifif表表 示:当示:当aiai为为1 1时,时,aiai被重新赋为被重新赋为0 0;当;当aiai为为0 0时,时, aiai被重新赋为被重新赋为1 1。但通过以下算术运算:。但通过以下算术运算: ai=1-aiai=1-ai 就很好地模拟就很好地模拟“开关开关”灯的操作。灯的操作。main( )main(
6、) int n,a1000,i,k; int n,a1000,i,k; print(“input a number”); print(“input a number”); input(“%d”,&n); input(“%d”,&n); for( i=1;i=n;i+) for( i=1;i=n;i+) ai=0; ai=0; for( i=2;i=n;i+) for( i=2;i=n;i+) k=1; k=1; while ( i while ( i* *k=n)k=n) ai ai* *k=1-aik=1-ai* *k;k; k=k+1; k=k+1; for( i=1;i=n;i+) fo
7、r( i=1;i=b+c or b=a+c or c=a+b) if(a=b+c or b=a+c or c=a+b) print(“dont form a triangle”); print(“dont form a triangle”); else else flag=0; flag=0; if (a if (a* *a=ba=b* *b+cb+c* *c or bc or b* *b=ab=a* *a+ca+c* *c or cc or c* *c=ac=a* *a+ba+b* *b)b) print(“form a right-angle triangle”); flag=1; pri
8、nt(“form a right-angle triangle”); flag=1; if(a=b and b=c) if(a=b and b=c) print(“form a equilateral triangle”);flag=1; print(“form a equilateral triangle”);flag=1; else if(a=b or b=c or c=a) else if(a=b or b=c or c=a) print(“form a equal haunch triangle”);flag=1; print(“form a equal haunch triangle
9、”);flag=1; if(flag=0) if(flag=0) print(“form a triangle”); print(“form a triangle”); 【例【例4 4】编写算法,求任意三个数的最小公倍数。】编写算法,求任意三个数的最小公倍数。算法设计:算法设计:1 1)用短除法求三个已知数的最小公倍数的过程就是求它们的因)用短除法求三个已知数的最小公倍数的过程就是求它们的因数之积,这个因数可能是三个数共有的、两个数共有或一个数数之积,这个因数可能是三个数共有的、两个数共有或一个数独有的三种情况。独有的三种情况。2 2)在手工完成这个问题时,我们的大脑可以判断三个数含有哪)在手
10、工完成这个问题时,我们的大脑可以判断三个数含有哪些因数,及属于哪种情况。用算法实现就只能利用尝试法了。些因数,及属于哪种情况。用算法实现就只能利用尝试法了。尝试的范围应该是尝试的范围应该是22三个数中最大数之间的因数。三个数中最大数之间的因数。 无论因数属于以下三种情况之一,都只算作一个因数,累乘无论因数属于以下三种情况之一,都只算作一个因数,累乘一次。一次。若某个数是三个数的共有的因数,如:若某个数是三个数的共有的因数,如:2 2是是2 2,1414,6 6的因数;的因数; 若某个数是其中两个数的因数,如:若某个数是其中两个数的因数,如:2 2 是是2 2,5 5,6 6的因数;的因数; 若
11、某个数是其中某一个数的因数,如:若某个数是其中某一个数的因数,如:2 2 是是2 2,5 5,9 9的因数。的因数。以上三种情况例子中,因数以上三种情况例子中,因数2 2都只累乘一次都只累乘一次3 3)再看例子)再看例子2 2,4 4,8 8中中2 2是的因数,为避免因数重复计算,一定要用是的因数,为避免因数重复计算,一定要用2 2整除整除这三个数得到这三个数得到1 1,2 2,4 4。注意到。注意到2 2仍是(仍是(1 1,2 2,4 4)的因数,所以在尝试某)的因数,所以在尝试某数是否是三个数的因数时,不是用条件语句数是否是三个数的因数时,不是用条件语句ifif,而是要用循环语句,而是要用
12、循环语句whilewhile,以保证将三个数中所含的某个因数能全部被找出,直到三个数都不含这个以保证将三个数中所含的某个因数能全部被找出,直到三个数都不含这个数做因数时循环结束。数做因数时循环结束。 main( ) main( ) int x1,x2,x3,t=1,i,flag,x0; int x1,x2,x3,t=1,i,flag,x0; print(“Input 3 number:”); input(x1,x2,x3); print(“Input 3 number:”); input(x1,x2,x3); x0=max(x1,x2,x3); x0=max(x1,x2,x3); for (i
13、=2;i=x0;i=i+1) for (i=2;i=x0;i=i+1) flag=1; flag=1; while(flag=1) while(flag=1) flag=0; flag=0; if (x1 mod i=0) x1=x1/i; flag=1; if (x1 mod i=0) x1=x1/i; flag=1; if(x2 mod i=0) x2=x2/i; flag=1; if(x2 mod i=0) x2=x2/i; flag=1; if(x3 mod i=0) x3=x3/i; flag=1; if(x3 mod i=0) x3=x3/i; flag=1; if (flag=1
14、) t=t if (flag=1) t=t* *i; /whilei; /while结束符结束符 x0=max(x1,x2,x3) /forx0=max(x1,x2,x3) /for结束符结束符 print(“The result is ”,t);print(“The result is ”,t); 3.3.3 3.3.3 信息数字化信息数字化 学到这里,我们已经会处理许多数值计算方面的问题了。学到这里,我们已经会处理许多数值计算方面的问题了。计算机算法还能帮助我们做什么?从我们学到的计算机基础知计算机算法还能帮助我们做什么?从我们学到的计算机基础知识知道,计算机能存储和处理各种多媒体信息,如
15、:图形、图识知道,计算机能存储和处理各种多媒体信息,如:图形、图象、声音等,当然前提条件是将这些信息进行的数字化。本书象、声音等,当然前提条件是将这些信息进行的数字化。本书已声明不研究专业性强的算法,所以对多媒体信息的数字化及已声明不研究专业性强的算法,所以对多媒体信息的数字化及其压缩存储、处理等相关的算法,请读者阅读别的参考资料。其压缩存储、处理等相关的算法,请读者阅读别的参考资料。下面就一些表面上看是非数值的问题,但经过进行数字化后,下面就一些表面上看是非数值的问题,但经过进行数字化后,就可方便进行算法设计的问题做简单介绍。就可方便进行算法设计的问题做简单介绍。【例【例1 1】警察局抓了】
16、警察局抓了a a,b b,c c,d d四名偷窃嫌疑犯,其中只有一人是小四名偷窃嫌疑犯,其中只有一人是小偷。审问中偷。审问中 a a说:说:“我不是小偷。我不是小偷。” b b说:说:“c c是小偷。是小偷。” c c说:说:“小偷肯定是小偷肯定是d d。” d d说:说:“c c在冤枉人。在冤枉人。”现在已经知道四个人中三人说的是真话,一人说的是假话,现在已经知道四个人中三人说的是真话,一人说的是假话,问到底谁是小偷?问到底谁是小偷?问题分析:将问题分析:将a,b,c,da,b,c,d将四个人进行编号,号码分别将四个人进行编号,号码分别为为1 1,2 2,3 3,4 4。则问题可用枚举尝试法
17、来解决。则问题可用枚举尝试法来解决。算法设计:算法设计:用变量用变量x x存放小偷的编号,则存放小偷的编号,则x x的取值范围从的取值范围从1 1取到取到4 4,就假设了他们中的某人是小偷的所有情况。四个人所说的话就可就假设了他们中的某人是小偷的所有情况。四个人所说的话就可以分别写成:以分别写成: a a说的话:说的话:x1x1 b b说的话:说的话:x=3x=3 c c说的话:说的话:x=4x=4 d d说的话:说的话:x4x4或或not(x=4)not(x=4) 注意注意: :在在x x的枚举过程中,当这四个逻辑式的值相加等于的枚举过程中,当这四个逻辑式的值相加等于3 3时,即表时,即表示
18、示“四个人中三人说的是真话,一人说的是假话四个人中三人说的是真话,一人说的是假话”。 算法如下:算法如下:main( )main( ) int x; int x; for(x=1;x=4;x+) for(x=1;x=4;x+) if(x1)+(x=3)+(x=4)+(x4)=3) if(x1)+(x=3)+(x=4)+(x4)=3) print(chr(64+x),“is a thief .”); print(chr(64+x),“is a thief .”); 运行结果:运行结果: c is a thief .c is a thief .【例【例2 2】三位老师对某次数学竞赛进行了预测。他们
19、的预测如下:】三位老师对某次数学竞赛进行了预测。他们的预测如下: 甲说:学生甲说:学生A A得第一名,学生得第一名,学生B B得第三名。得第三名。 乙说:学生乙说:学生C C得第一名,学生得第一名,学生D D得第四名。得第四名。 丙说:学生丙说:学生D D得第二名,学生得第二名,学生A A得第三名。得第三名。竞赛结果表明,他们都说对了一半,说错了一半,并且无并列名次,竞赛结果表明,他们都说对了一半,说错了一半,并且无并列名次,试编程输出试编程输出A A、B B、C C、D D各自的名次。各自的名次。问题分析:用数问题分析:用数1 1,2 2,3 3,4 4分别代表学生分别代表学生a a,b b
20、,c c,d d获得的名次。获得的名次。问题就可以利用三重循环把所有的情况枚举出来。问题就可以利用三重循环把所有的情况枚举出来。 算法设计:算法设计: 1 1)用)用a a,b b,c c,d d 代表四个同学,其存储的值代表他们的名代表四个同学,其存储的值代表他们的名 次。次。 设置第一层计数循环设置第一层计数循环a a的范围从的范围从1 1到到4 4; 设置第二层计数循环设置第二层计数循环b b的范围从的范围从1 1到到4 4; 设置内计数循环设置内计数循环c c的范围从的范围从1 1到来到来4 4; 由于无并列名次,名次的和为由于无并列名次,名次的和为1+2+3+4=101+2+3+4=
21、10,由此可计算,由此可计算 出出d d的名次值为的名次值为10-a-b-c10-a-b-c。 2 2)问题的已知内容,可以表示成以下几个条件式:)问题的已知内容,可以表示成以下几个条件式: (1) (a=1)+(b=3)=1(1) (a=1)+(b=3)=1 (2) (c=1)+(d=4)=1 (2) (c=1)+(d=4)=1 (3) (d=2)+(a=3)=1 (3) (d=2)+(a=3)=1 若三个条件均满足,则输出结果,若不满足,继续循环若三个条件均满足,则输出结果,若不满足,继续循环 搜索,直至循环正常结束。搜索,直至循环正常结束。 算法如下:算法如下:main( )main(
22、)int a,b,c,d;int a,b,c,d;for( a=1;a=4;a=a+1)for( a=1;a=4;a=a+1) for( b=1;b=4;b=b+1) for( b=1;b=4;b=b+1) if (ab) if (ab) for( c=1;c=4;c=c+1) for( c=1;c=4;c=c+1) if (ca and cb) if (ca and cb) d=10-a-b-c; d=10-a-b-c; if (da and db and dc ) if (da and db and dc ) if(a=1)+(b=3)=1 and (c=1)+(d=4)=1 and if
23、(a=1)+(b=3)=1 and (c=1)+(d=4)=1 and (d=2)+(a=3)=1) (d=2)+(a=3)=1) print( “a,b,c,d=”,a,b,c,d); print( “a,b,c,d=”,a,b,c,d); 输入任意输入任意5 5个数个数x1,x2,x3,x4,x5x1,x2,x3,x4,x5每相邻两个数之间填上一每相邻两个数之间填上一个运算符。在填入四个运算符后,使得表达式值为一个指个运算符。在填入四个运算符后,使得表达式值为一个指定值定值y(yy(y由键盘输入由键盘输入) )。求出所有满足条件的表达式。求出所有满足条件的表达式。 算法设计:算法设计:1
24、1)枚举法解题:先填四个)枚举法解题:先填四个+。检验条件表达式。检验条件表达式 x1+x2+x3+x4+x5=yx1+x2+x3+x4+x5=y,如果不成立,则将第四个运算符,如果不成立,则将第四个运算符 改为改为-,以后改,以后改* *、改、改/。轮完一遍,把第三个运算。轮完一遍,把第三个运算 符改为符改为-,第四个运算符按,第四个运算符按+ +、- -、* *、/顺序再轮一顺序再轮一 遍,遍,如此下去,直至第一个运算符,由如此下去,直至第一个运算符,由+至至/轮轮 完为止。完为止。【例【例3 3】填写运算符】填写运算符2 2)若当前运算符轮到)若当前运算符轮到/则运算符右端的数必须非零,
25、因为则运算符右端的数必须非零,因为 零不能当除数。零不能当除数。3 3)为了便于循环我们在算法中,把)为了便于循环我们在算法中,把+ +、- -、* *、/数字化作数字化作1 1、 2 2、3 3、4 4。五个数据间需四个运算符,用一个有四个元。五个数据间需四个运算符,用一个有四个元 素数组素数组i1i4 i1i4 来代表它们。来代表它们。 4 4)为了解决运算的优先级问题,我们设置如下变量:)为了解决运算的优先级问题,我们设置如下变量: f-f-减去标志。减法运算时,置减去标志。减法运算时,置f=-1,f=-1,否则否则f=1f=1; q-q-若当前运算符为若当前运算符为+ +(- -)时)
26、时,q,q存贮运算符的左项值;存贮运算符的左项值; 若当前运算符为若当前运算符为* *(/ /)时,)时,q q存贮两数乘(除)后存贮两数乘(除)后 结果;结果; p-p-累加器。每填一个算符累加器。每填一个算符p=p+fp=p+f* *q q。 for(j=1;j=5;j+) for(j=1;j=5;j+) input(nj); input(nj);print(“ input result:”); print(“ input result:”); input(n0); input(n0); total=0;total=0;for (i1=1 ;i1=4 ;i1+) for (i1=1 ;i1
27、=4 ;i1+) if (i14) | (n2!=0) ) if (i14) | (n2!=0) ) for (i2=1 ;i2=4 ;i2+) for (i2=1 ;i2=4 ;i2+) if( (i24) | (n3!=0) ) if( (i24) | (n3!=0) ) for (i3=1 ;i3=4 ;i3+) for (i3=1 ;i3=4 ;i3+) if (i34) |(n4!=0) ) if (i34) |(n4!=0) ) for (i4=1 ;i4=4 ;i4+) for (i4=1 ;i4=4 ;i4+) if(i44) | (n5!=0) ) if(i44) | (n5
28、!=0) ) p=0; q=n1; f=1; p=0; q=n1; f=1; for (k=1;k=4;k+)for (k=1;k=4;k+) switch (ik) switch (ik) case 1: p=p+f case 1: p=p+f* *q; f=1; q=nk+1; break;q; f=1; q=nk+1; break; case 2: p=p+f case 2: p=p+f* *q; f=-1; q=nk+1; break;q; f=-1; q=nk+1; break; case 3: q=q case 3: q=q* *nk+1; break;nk+1; break; c
29、ase 4: q=q/nk+1; case 4: q=q/nk+1; if ( p+fif ( p+f* *q=n0)q=n0) total+; print (“total: ” ,total); total+; print (“total: ” ,total); for (k=1;k=4;k+) for (k=1;k2k k取最大时记为取最大时记为k1,k1+1号箱为的次品号箱为的次品箱;箱; 继续讨论继续讨论w/10-2 k1 2 k k取最大时记为取最大时记为k2, k2+1号箱为号箱为的次品箱;的次品箱; 直到取等号直到取等号w/10-2 ki-1 =2 ki ,ki+1号箱为的次品箱
30、;结束。号箱为的次品箱;结束。 算法如下:算法如下:main( )main( ) int i,k,n,w1=0,w2=0,t; int i,k,n,w1=0,w2=0,t; print(“Input the number of boxes:”) print(“Input the number of boxes:”); input(n);input(n); t=1; t=1; for (i=1;i=n;i+) for (i=1;i=0) while( w1-t=0) t=t t=t* *2; k=k+1; 2; k=k+1; print(k,“is bad”); print(k,“is bad”
31、); w1=w1-t/2; w1=w1-t/2; 算法说明:算法中的最后一个内层算法说明:算法中的最后一个内层while while 循环及其后语句,是用于计循环及其后语句,是用于计算最接近当前重量算最接近当前重量w1w1的的2 k,则,则k k号箱为次品箱。这个过程也可以通号箱为次品箱。这个过程也可以通过使用函数来完成。过使用函数来完成。 main( )main( ) int i,k,n,w1=0,w2=0,t; int i,k,n,w1=0,w2=0,t; print(“Input the number of boxes:”) print(“Input the number of boxe
32、s:”);input(n);input(n);t=1;t=1;for (i=1;i=n;i=i+1)for (i=1;i=n;i=i+1) print(i, “box take”,t,”letter.”); print(i, “box take”,t,”letter.”); w1=w1+t; t=t w1=w1+t; t=t* *2; 2; w1=w1w1=w1* *100;100;print(“n normal weight ”,w1);print(“n normal weight ”,w1);print(“Input reality weight”);input(w2);print(“In
33、put reality weight”);input(w2);w1=(w1-w2)/10; w1=(w1-w2)/10; while( w10)while( w10) k=log(w1)/log(2); / k=log(w1)/log(2); /以以2 2为底取对数为底取对数 print(k+1 ,“is bad”);print(k+1 ,“is bad”); w1=w1-pow(2,k); / pow(2,k) w1=w1-pow(2,k); / pow(2,k)的功能是求的功能是求2k 【例【例5 5】编写算法对输入的一个整数,判断它能否被】编写算法对输入的一个整数,判断它能否被3 3,5
34、 5, 7 7整除,并输出以下信息之一:整除,并输出以下信息之一: (1 1) 能同时被能同时被3 3,5 5,7 7整除;整除; (2 2) 能被其中两数(要指出哪两个)整除;能被其中两数(要指出哪两个)整除; (3 3) 能被其中一个数(要指出哪一个)整除;能被其中一个数(要指出哪一个)整除; (4 4) 不能被不能被3 3,5 5,7 7任一个整除。任一个整除。34 优化算法的数学模型优化算法的数学模型341 杨辉三角形的应用杨辉三角形的应用342 最大公约数的应用最大公约数的应用343 公倍数的应用公倍数的应用344 裴波那契数列应用裴波那契数列应用345 递推关系求解方程递推关系求解
35、方程 说到数学建模,有好多人感到不知所云,下说到数学建模,有好多人感到不知所云,下面我们看一个很简单的例子:面我们看一个很简单的例子: 已知有五个数,求前四个数与第五个数分已知有五个数,求前四个数与第五个数分 别相乘后的最大当数。给出两个算法分别如下:别相乘后的最大当数。给出两个算法分别如下:1认识数学模型和数学建模认识数学模型和数学建模max1(int a,b,c,d,e) max2(int a,b,c,d,e) int x ; int x a=a*e; if (ab) b=b*e; x=a; c=c*e; else d=d*e; x=b; if( ab) if (cx) x=a; x=c;
36、 else if (dx) x=b; x=d; if (cx) x=x*e; x=c; print(x); if (dx) x=d; print(x); 操作算法 乘法赋值条件判断 Max1 4 7 3 Max2 1 4 3 以上两个算法以上两个算法 数学建模数学建模就是把现实世界中的实际问题加以提就是把现实世界中的实际问题加以提炼,抽象为数学模型,求出模型的解,验证模型炼,抽象为数学模型,求出模型的解,验证模型的合理性,并用该数学模型所提供的解答来解释的合理性,并用该数学模型所提供的解答来解释现实问题,我们把数学知识的这一应用过程称为现实问题,我们把数学知识的这一应用过程称为数学建模。数学建
37、模。n2数学建模的基本方法数学建模的基本方法从分析问题的几种简单的、特殊的情况中,从分析问题的几种简单的、特殊的情况中,发现一般规律或做出某种猜想,从而找到解决发现一般规律或做出某种猜想,从而找到解决问题的途径。这种研究问题方法叫做归纳法。问题的途径。这种研究问题方法叫做归纳法。即归纳法是从简单到复杂,由个别到一般的一即归纳法是从简单到复杂,由个别到一般的一种研究方法。种研究方法。3 34 41 1 杨辉三角形的应用杨辉三角形的应用【例】求【例】求n次二项式各项的系数:已知二项式的展次二项式各项的系数:已知二项式的展 开式为:开式为:问题分析:若只用的数学组合数学的知识,直接建模问题分析:若只
38、用的数学组合数学的知识,直接建模 k=0,1,2,3n。用这个公式去计算,用这个公式去计算,n+1个系数,即使你考虑到了个系数,即使你考虑到了前后系数之间的数值关系:算法中也要有大量的乘前后系数之间的数值关系:算法中也要有大量的乘法和除法运算,效率是很低的。法和除法运算,效率是很低的。数学知识是各阶多项式的系数呈杨辉三角形的规律数学知识是各阶多项式的系数呈杨辉三角形的规律(a+b)0 1 (a+b)1 1 1(a+b)2 1 2 1(a+b)3 1 3 3 1(a+b)4 1 4 6 4 1(a+b)5 则求则求n次二项式的系数的数学模型就是求次二项式的系数的数学模型就是求n阶杨辉三角阶杨辉三
39、角形。形。算法设计要点:算法设计要点: 除了首尾两项系数为除了首尾两项系数为1外,当外,当n1时,时,(a+b)n的中间各项系数是的中间各项系数是(a+b)n-1的相应两项系数之和,的相应两项系数之和,如果把如果把(a+b)n的的n+1的系数列为数组的系数列为数组c,则除了,则除了c(1)、c(n+1)恒为恒为1外,设外,设(a+b)n的系数为的系数为c(i),(a+b)n-1 的系数的系数设为设为c(i)。则有:。则有: c(i)=c(i)+c(i-1) 而当而当n=1时,只有两个系数时,只有两个系数 c(1) 和和 c(2) (值都为值都为1)。不难。不难看出,对任何看出,对任何n, (a
40、+b)n的二项式系数可由的二项式系数可由(a+b)n-1的系数的系数求得,直到求得,直到n=1时,两个系数有确定值,故可写成递归子时,两个系数有确定值,故可写成递归子算法。算法。 coeff(int a ,int n) if (n=1) a1=1; a2=1; else coeff(a,n-1); an+1=1; for (i=n;i=2;i- -) ai=ai+ai-1; a1=1; 342 最大公约数的应用最大公约数的应用【例】数组中有【例】数组中有n个数据,要将它们顺序循环向后移个数据,要将它们顺序循环向后移k位,位,即前面的元素向后移即前面的元素向后移k位,后面的元素则循环向前移位,后
41、面的元素则循环向前移k位,例:位,例:1、2、3、4、5循环移循环移3位后为:位后为:3、4、5、1、2。考虑到。考虑到n会很大,不允许用会很大,不允许用2*n以上个空间来以上个空间来完成此题。完成此题。 问题分析问题分析1:若题目中没有关于存储空间的限制,我:若题目中没有关于存储空间的限制,我们可以方便地开辟两个一维数组,一个存储原始数据,们可以方便地开辟两个一维数组,一个存储原始数据,另一个存储移动后的数据。另一个存储移动后的数据。main( )main( )int a100,b100,i,n,k;int a100,b100,i,n,k; input(n,k ); input(n,k );
42、 for(i=0;in;i=i+1) for(i=0;in;i=i+1) input(ai); input(ai); for(i=0;in;i=i+1) for(i=0;in;i=i+1) b(k+i) mod n=ai; b(k+i) mod n=ai;for(i=0;in;i=i+1)for(i=0;in,这样移动会出,这样移动会出现重复操作现重复操作,可以在输入数据可以在输入数据后,执行后,执行k = k mod n; 以保以保证不出现重复移动的问题。证不出现重复移动的问题。这个算法的移动(赋值)次这个算法的移动(赋值)次数为数为k*n。当。当n较大时不是一较大时不是一个好的算法。个好的
43、算法。问题分析问题分析2: 将最后一个存储空间的数据将最后一个存储空间的数据,存储在临时存储空间中;存储在临时存储空间中; 其余数据逐个向后移动一位。其余数据逐个向后移动一位。这样操作共这样操作共k次就能完成问题的要求。算法次就能完成问题的要求。算法2如下:如下:main( )main( )int a100, i,j,n,k,temp;int a100, i,j,n,k,temp; input(n,k); input(n,k); for(i=0;in;i=i+1) for(i=0;in;i=i+1) input(ai); input(ai); for(i=0;ik;i=i+1) for(i=0
44、;i0;j=j-1)for(j=n-1;j0;j=j-1) aj=aj-1; aj=aj-1; a0= temp ; a0= temp ; for(i=0;in;i=i+1)for(i=0;in;i=i+1) print(ai); print(ai); 问题分析问题分析3 利用一个临时存储空间,把每一个数据一次移动到利用一个临时存储空间,把每一个数据一次移动到位:位:1) 一组循环移动的情况:一组循环移动的情况: 通过计算我们可以确定某个元素移动后的具体位置,如通过计算我们可以确定某个元素移动后的具体位置,如n=5, k=3时:时: 0、1、2、3、4循环移循环移3位后为位后为2、3、4、0、
45、1。可通过计算得出可通过计算得出0移到移到3的位置,的位置,3移到移到1的位置,的位置,1移到移到4的位置,的位置,4移到移到2的位置,的位置,2移到移到0的位置;一组移动(的位置;一组移动(0-3-1-4-2-0)正好将)正好将全部数据按要求进行了移动。这样只需要一个辅助变量,每个数全部数据按要求进行了移动。这样只需要一个辅助变量,每个数据只需一次移动就可完成整个移动过程。据只需一次移动就可完成整个移动过程。如果算法就这样按一组移动去解决问题,就错了。因为还有其它如果算法就这样按一组移动去解决问题,就错了。因为还有其它情况。情况。2)多组循环移动的情况:算法不能按一组移动去解决问题。)多组循
46、环移动的情况:算法不能按一组移动去解决问题。 看下一个例子,当看下一个例子,当n=6,k=3时时,1、2、3、4、5、6经移动经移动 的的结果是结果是4、5、6、1、2、3. 并不象上一个例子并不象上一个例子,一组循环一组循环 移动没移动没有将全部数据移动到位。还需要(有将全部数据移动到位。还需要(2-5-2)()(3-6-3)两组移动,)两组移动,共要进行三组循环移动(共要进行三组循环移动(1-4,2-5,3-6)才能将全部数据操作)才能将全部数据操作完毕。完毕。 循环移动的组数,与循环移动的组数,与k、n的是怎么样的关系呢?的是怎么样的关系呢? 我们再看一个例子,当我们再看一个例子,当N=
47、6,K=2时时, 1、2、3、4、5、6经移动的结果是经移动的结果是5、6、1、2、3、4. 1移到移到3的位置,的位置,3移到移到5的位置,的位置,5移到移到1的位置,一组移动完成了的位置,一组移动完成了3个数据的移动,接个数据的移动,接下来,还有一组下来,还有一组2-4-6-2。共进行二组循环移动,就能将全部数。共进行二组循环移动,就能将全部数据移动完毕。据移动完毕。数学模型:循环移动的组数等于数学模型:循环移动的组数等于N与与K的最大公约数。的最大公约数。算法设计:算法设计:1)编写函数,完成求)编写函数,完成求n , k最大公约数最大公约数m的功能的功能2)进行)进行m组循环移动。组循
48、环移动。3)每组移动,和算法)每组移动,和算法2一样,通过计算可以确定某个一样,通过计算可以确定某个 元素移动后的具体位置。在移动之前,用临时变量元素移动后的具体位置。在移动之前,用临时变量 存储需要被覆盖的数据。存储需要被覆盖的数据。算法算法3如下:如下:ff ( int a ,int b) t = 1; for ( i = 2;i=a and ib0a0=b0,a2=b1, b0a2=b1, b0(a0a0)=a2=a2,b1= b0b1= b0;a4=b1, b0a4=b1, b0(a2a2)= a4= a4,b1= b0b1= b0;a0=b1, b0a0=b1, b0(a4a4)=
49、a0 = a0 ,b1= b0b1= b0;改进后(和算法改进后(和算法2 2类似):类似): a4=b a4=b ;a2=a4,a0=a2, b=a0a2=a4,a0=a2, b=a0。 将每组最后一个数据元素存储在辅助存储空间,以后就可将每组最后一个数据元素存储在辅助存储空间,以后就可以安全地覆盖后面的数组元素了(注意覆盖顺序)。这样,一以安全地覆盖后面的数组元素了(注意覆盖顺序)。这样,一组循环移动只需一次将数据存入辅助存储空间,其后一次移动组循环移动只需一次将数据存入辅助存储空间,其后一次移动只需一次赋值,全部工作大约需要赋值只需一次赋值,全部工作大约需要赋值n n次就可完成。请读者尝
50、次就可完成。请读者尝试完成。试完成。 343 公倍数的应用公倍数的应用【例】编程完成下面给【例】编程完成下面给“余余”猜数的游戏:猜数的游戏:你心里先想好一个你心里先想好一个1100之间的整数之间的整数x,将它分别除以,将它分别除以3、5和和7并得到三个余数。你把这三个余数告诉计算机,计算机并得到三个余数。你把这三个余数告诉计算机,计算机能马上猜出你心中的这个数。游戏过程如下:能马上猜出你心中的这个数。游戏过程如下:please think of a number between 1 and 100your number divided by 3 has a remainder of? 1yo
51、ur number divided by 5 has a remainder of? 0your number divided by 7 has a remainder of? 5let me think a momentyour number was 40问题分析:算法的关键是:找出余数与求解数之间的关系,问题分析:算法的关键是:找出余数与求解数之间的关系,也就是建立问题的数学模型。也就是建立问题的数学模型。数学模型:数学模型: 1)不难理解当)不难理解当s=u+3*v+3*w时,时,s除以除以3的余数与的余数与u除以除以3的的余数是一样的。余数是一样的。 2)对)对s=cu+3*v+3*w
52、,当,当c除以除以3余数为余数为1的数时的数时, s除以除以3的的余数与余数与u除以除以3的余数也是一样的。证明如下:的余数也是一样的。证明如下: c 除以除以 3余数为余数为1,记,记c=3*k+1,则,则s=u+3*k*u+3*v+3*w,由,由1)的结的结论,上述结论正确。论,上述结论正确。 记记a,b,c分别为所猜数据分别为所猜数据d除以除以3,5,7后的余数,则后的余数,则 d=70*a+21*b+15*c。 为问题的数学模型,其中为问题的数学模型,其中70称作称作a的系数,的系数,21称作称作b的系数的系数,15称作称作c的系数。的系数。由以上数学常识,由以上数学常识,a、b、c的系数必须满足:的系数必须满足:1) b、c的系数能被的系数能被3整除,且整除,且a的系数被的系数被3整除余整除余1;这样;这样d除以除以3的余数与的余数与a相同。相同。2) a、c的系数能被的系数能被5整除,且整除,且b的系数被的系数被5整除余整除余1;这样;这样d除以除以5的余数与的余数与b相同。相同。3) a、b的系数能被的系数能被7整除,且整除,且c的系数被的系数被7整除余整除余1;这样;这样d除以除以7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年建立技术攻关容错机制与核心技术目录动态更新机制操作指南
- 2026年监测数据弄虚作假六类情形认定标准与自查整改报告
- 云南省曲靖市沾益区播乐乡罗木中学2026届初三第3次联考生物试题含解析
- 2026届江苏省苏州市重点中学初三第四次月考化学试题试卷含解析
- 2026届浙江乐清市育英寄宿校初三下学期第三次诊断考试化学试题试卷含解析
- 2026年四川省中考化学试题原创模拟卷(九)含解析
- 河北省丰润区重点名校2025-2026学年高中毕业班第一次质量检测试题生物试题含解析
- 2026届四川泸县初三1月份统一考试(化学试题理)试卷含解析
- 2026年黑龙江省七台河市中考生物试题命题比赛模拟试卷(22)含解析
- 2026年低空经济领域数据合规审计:通信网络覆盖与数据安全保障体系验证
- 2026湖北武汉市江汉城市更新有限公司及其下属子公司招聘11人笔试备考题库及答案解析
- 2025-2026学年地质版(新教材)小学体育与健康二年级全一册第二学期教学计划及进度表
- 2026年部编版新教材道德与法治小学三年级下册教学计划(含进度表)
- 学校洗衣机卫生消毒制度
- 2025年河南信阳事业单位联考《公共基础知识》试题附答案
- 2026年重庆公务员考试《申论》试题题库(答案+解析)
- 2026年书记员考试题库100道含答案(考试直接用)
- 2025至2030中国变频器行业调研及市场前景预测评估报告
- 动物疫病防治员题库(含参考答案)
- 2025年平顶山工业职业技术学院单招职业适应性考试题库附答案
- 2025年宁夏财经职业技术学院单招职业倾向性测试题库附答案解析
评论
0/150
提交评论