1、1,湖南省计算机等级考试 辅导,2006年11月 计算机系刘永逸,2,内容提要,概括性指导 重点结构、常用标准函数、自定义函数、基本处理、逻辑表达式 常用算法:穷举法、递推 分类练习 十多种常见类型,3,FoxPro程序的基本结构,顺序结构 选择(分支)结构 IF.ELSE.ENDIF 多选择(分支)结构 DO CASE.ENDCASE,4,循环结构 DO WHILE.ENDDO FOR .ENDFOR / NEXT 嵌套 分支与分支 循环与循环 循环与分支,5,程序中可省代码,set talk on clear & 此句一般保留 set talk off return,6,FoxPro程序设
2、计重点结构,给出两种常用结构 可作“模板”使用 学会填空!,7,FOR . ENDFOR | NEXT 结构for i= to step if (loop、exit) endif endfor 计数循环!,8,DO WHILE . ENDDO结构s=.i=.do while enddo? . 一般的当型循环!,9,FoxPro程序中常用函数,系统内部标准函数 取整:int(x) 求余数:mod(a,b ) 求平方根:sqrt(x) 绝对值:abs(x) 其它.,10,用户自定义函数 逻辑函数判定:prime(x) 外部函数的方法(不讲) 内部函数的方法(程序的一部分) 见:有关素数程序设计部分
3、 注:二级必备!,11,程序中最基本的处理,计数 初值:n=0 或 . 循环处理:n=n+1 连加 初值:s=0 或 . 循环处理:s=s+i 或 .,12,连乘 初值:t=1 或 . 循环处理:t=t*i 或 .,13,最常用的判断,a被b整除(倍数、因子) mod(a,b)=0 a是整数 int(a)=a 应用:求不定方程的整数解,14,多条件组合为逻辑表达式,x能被3整除但不能被4整除 mod(x,3)=0 and mod(x,4)#0 x是能被3或5整除的偶数 mod(x,2)=0 and ( or ),15,精确与非精确编程思路,精确编程:只输出所需结果。 非精确编程:输出相关的数据
4、,从中容易得出所需要的结果。,16,例:设s=2+4+6+,求s的最大值,使s=1000。#992 (下两页有程序),17,精确编程(不细讲),clear n=0 s=0 do while s1000n=n+2s=s+n * ? n,s enddo ? s-n,18,非精确编程,clear s=0 for n=2 to 100 step 2s=s+n? n,s endfor,19,1、简单的求和问题,数列求和 ai=f(n), 求 sn=a1+ an , 是数列 循环处理:a=f(i) , s=s+a 或 s=s+f(i) 一定条件下的求和,20,求1108所有整数的平方和。#425754 求
5、s=1*2+2*3+100*101 求s=1*3+3*5+99*101 可在Excel中求解,21,求1135的平方根的和。#1051.31 基本算法:循环、连加 可在Excel中求解 求1135的和的平方根。,22,求351,432之间所有既不能被3整除,又不能被8整除的整数的和。#18413 求1到1000之内能被7或11整除,但不能同时被7和11整除的所有整数的个数。#208,23,2、等比数列及求和,求2+4+8+16+32+,当累加数大于9000时,则终止计算并输出结果。#16382,24,已知S1=1, S2=1+2, S3=1+2+4, ,求S=S1+S2+S3+S4+S20的值
6、。#2097130,25,一球从100米高处落至平地并连续反弹、落下。设每次反弹高度按4/5倍递减,试求出最小的自然数n,使得此球从开始下落至第n次着地时在垂直方向所经过的总路程超过800米。 基本算法:循环、(连乘、)连加,26,3、递推问题(Excel可解),设有用26个表达式:a=1,b=1/(a+1),c=1/(b+2),z=1/(y+25),试求出z的值。#0.04 基本算法:循环、单项递推 f(1)=1,f(n)=1/(f(n-1)+n-1),27,斐波那契数列f(i):1,1,2,3,5,8, 试输出前20项。 基本算法:循环、递推 f(1)=1,f(2)=1,f(n)=f(n-
7、2)+f(n-1),28,基本算法(使用数组) 定义数组:dimension f(50) 循环初值:f(1)=1, f(2)=1; 循环处理:f(n)=f(n-2)+f(n-1),29,clear dime f(20) f(1)=1 f(2)=1 ? f(1),f(2) for n=3 to 20f(n)=f(n-2)+f(n-1)? f(n) endfor,30,斐波那契数列f(i):1,1,2,3,5,8,求F(45)值。 #1134903170 求F(1)+F(2)+F(50) #32951280098 求F(1)+F(3) +F(49) #12586269025 求10000000内最
8、大的 #9227465 求10000000内的个数 #35,31,斐波那契数列相关问题(例1),求S=1/2+2/3+3/5+5/8+的前30项的和。#18.46 f(n):1,2,3,5,8,,31项 S=1/2 S=S+f(n-1)/f(n), n=3,4,.,31,32,斐波那契数列相关问题(例2),求S=1/2+3/5+8/13+21/34+的前30项的和。#18.40 f(n):1,2,3,5,8,,60项 S=1/2 S=S+f(n-1)/f(n), n=4,6,8,.,60,33,三项递推的数列,一个数列,它的头三个数为0,0,1,以后的每个数都是其前三个数的和,求此数列的前30
9、项之和。#18947744,34,4、常见数字问题的处理,水仙花数:三位数,等于其各位数字之立方和。 记住10000以内: 153、370、371、407 考试中,有四位水仙花数之说。看清题意!,35,水仙花数的算法是数字问题之根本! 算法一:单循环(x:100999) 由数x得出数字a b c ? 熟练掌握一种从数中取数字的方法 算法二:三重循环(a:19 b,c:09) 由数字a、b、c组成数x(100999),36,设x是一个四位数,千位到个位分别是a、b、c、d,则: a=int(x/1000) b=int(x-1000*a)/100) c=int(x-1000*a-100*b)/10
10、) d=mod(x,10) (或见下页),37,b=mod(int(x/100),10) c=mod(int(x/10),10) 或 b=int(mod(x,1000)/100) c=int(mod(x,100)/10),38,clear & 水仙花程序1 n=0 for x=100 to 999a=int(x/100)b=int(x-a*100)/10)c=mod(x,10)if x=a*a*a+b*b*b+c*c*cn=n+1? n,xendif endfor,39,clear & 水仙花程序2 n=0 for a=1 to 9 for b=0 to 9 for c=0 to 9x=100
11、*a+10*b+cif x=a*a*a+b*b*b+c*c*c? xn=n+1endif endfor endfor endfor ? n,40,求在100,999内所有不含数字0且各位数字之积被96整除的数之和。#26640 a*b*c0 and mod(a*b*c,96)=0,41,求123,4321内回文数的个数。#120 都看作四位数abcd,两种情况处理: a=0 and b=d a0 and a=d and b=c,42,clear &回文数程序1 n=0 for x=123 to 4321a=int(x/1000)b=int(x-a*1000)/100)c=int(x-a*100
12、0-b*100)/10)d=mod(x,10)if (a=0 and b=d) or (a0 and a=d and b=c)n=n+1? xendif endfor ? n,43,clear & 回文数程序2 n=0 for a=0 to 4 for b=0 to 9 for c=0 to 9 for d=0 to 9x=1000*a+100*b+10*c+dif x=123 and x0 and a=d and b=c)? xn=n+1endif endfor endfor endfor endfor ? n,44,5、因子问题-因子个数、和,问100,200之间有奇数个不同因子的整数共有
13、多少个?#5 基本算法:二重循环 外循环:for x=100 to 200 穷举! 内循环模块一:求x之因子个数 内循环模块二:判断处理,45,clear n=0 for x=100 to 200k=0for i=1 to xif mod(x,i)=0k=k+1endifendforif mod(k,2)=1? xn=n+1endif endfor ? n,46,完数,求在10,1000之间的所有完数之和。各真因子之和(不包括自身)等于其本身的正整数称为完数。例如:6=1+2+3,6是完数。#524,47,set talk off clear k=0 for n=10 to 1000s=0fo
14、r i=1 to n/2if mod(n,i)=0s=s+iendifendforif s=nk=k+nendif endfor ? k set talk on return,48,完备数,已知24有8个正整数因子(即:1,2,3,4,6,8,12,24),而24正好能被其因子数8整除,求 10,100之间有多少个正整数能被其因子的个数整除。#12,49,多因子完备数的概念,若某整数N的所有因子之和等于N的倍数,则N称为多因子完备数,如数28,其因子1、2、4、7、14、28之和是56=2*28,28是多因子完备数。,50,求1,200之间有多少个多因子完备数。#4 基本算法:二重循环 外循环
15、:for x=1 to 200 穷举! 内循环功能一:求x的因子之和 内循环功能二:判断处理,51,最大公约数,求出583573和559399的最大公约数。 #79 基本算法:单循环求出所有因子,52,最小公倍数,求出9269和8671的最小公倍数。 #268801 a和b最大公约数d与最小公倍数k具有关系:a*b=d*k,53,6、组合问题:不定方程求解,大、中、小学生共36人消费,每大4元,每中2元,每小1元,共120元,问大、中、小学生人数组合有多少种可能?(每类学生学生的人数均不为0。) 基本算法:三重(或二重循环),54,程序(三重循环),clear n=0 for x=1 to 3
16、6for y=1 to 36for z=1 to 36if x+y+z=36 and 4*x+2*y+z=120n=n+1? x,y,zendifendforendfor endfor ? n,55,求方程3x-7y=1在条件|x|100且|y|40下的整数解的个数。#26 基本算法:二重或单循环,56,已知正整数A,B(假定AB),满足A*B=5432,求S=A+B的最小值。#153 数学结论:A与B相差小其和就小 基本算法:二重或单循环求因子,57,(勾、股、)弦数,勾、股、弦(正整数) a2+b2=c2 (求组数:abc) 基本算法(多重循环) (1) c:(有固定值或循环给出) (2)
17、 b:2c-1 (3) a:1b-1,58,求121,140 之间的弦数的个数。(如5是弦数:32+42=52)#8,59,clear for c=121 to 140for b=2 to c-1for a=1 to b-1if a*a+b*b=c*c?a,b,cendifendfendf endf,60,一个特殊考题,今有5羊4犬3鸡2兔值钱1496,4羊2犬6鸡3兔值钱1175,3羊1犬7鸡5兔值钱958,,2羊3犬5鸡1兔值钱861。求羊价。#177(、121、23、29 ) 5x+4y+3z+2w=1496 4x+2y+6z+3w=1175 3x+ y+7z+5w=958 2x+3y+
18、5z+ w=861,61,7、高精度计算除法,令a=113,b=355,不考虑四舍五入,求a/b的结果中: (1)小数点后第30位数字是几? (2)小数点后前30位数字之和是多少? 答案:(1) 4 (2) 160 (算法见下页) 计算器可得32位小数!,62,由a、b求q、r使10*a=b*q+r,基本算法 循环:for i=1 to 30 基本处理:模拟手工计算方法 每做一次除法,得一位商和余数 a=a*10 q=int(a/10) a=mod(a,b) r就是下一次的a,63,程序,a=113 b=355 s=0 for i=1 to 30a=a*10q=int(a/b),* ? str
19、(q,1)s=s+qa=mod(a,b) endfor ? q, s return,64,8、同构数,所谓“同构数”:一个数,它出现在它的平方数的右侧。 记住10000以内的:1、5、6、25、76、376、625、9376 特点:mod(x*x,m)=x m=10、100、1000,65,clear n=0 for x=1 to 9999do casecase x10m=10case x100m=100case x1000m=1000case x10000m=10000endcaseif mod(x*x,m)=x? x,x*xn=n+1endif endfor ? n,66,9、完全平方数,
20、完全平方数x(如144=122) y=int(sqrt(x) 满足条件:x=y*y 1,4,9,25, 求1000以内完全平方数个数。 1,4,9,16,961,67,clear n=0 for x=1 to 1000y=int(sqrt(x)if x=y*y? xn=n+1endif endfor ? n,68,10、数制转换,求出将十进制整数98765432等值转换为二进制形式表示后,其中数字1的个数。 #13 算法提示:单循环(2除取余法,直到余数为0) 循环处理:r=x%2,x=int(x/2) 计算器!,69,程序,clear x=98765432 p=2 n=0 do while
21、x0r=mod(x,p)if r=1n=n+1endif? p,x,rx=int(x/p) enddo ? str(x,20) ? n,70,求出将十进制小数0.5432等值转换为二进制形式表示后,其中小数点后第15位数字。#1 算法提示:单循环(2乘取整法) 循环处理:r=int(2*x),x=x-r 计算器: 0.5432*215二进制,71,程序,clear x=0.5432 p=2 ? x for n=1 to 15y=p*x? yz=int(y)x=y-z endfor ? z,72,11、素数(质数)问题,一般算法(略) 使用自定义函数,73,使用自定义内部逻辑函数prime(x)
22、,function prime parameters x private i if x2return .f. endif,for i=2 to x-1if mod(x,i)=0return .f.endif endfor return .t.,牢记在心,74,举例,求100以内素数个数。#25 求100, 999内素数和。#75067 求500, 2500内第25个素数#659 求3, 1000内最大的五个素数之和。#4919 (题1的程序见下页),75,clear n=0 for x=1 to 100if prime(x)? xn=n+1endif endfor ? n returnfunc
23、tion prime parameters x private i if x2return .f. endif for i=2 to x-1if mod(x,i)=0return .f.endif endfor return .t.,76,哥德巴赫猜测,德国数学家哥德巴赫曾猜测:任何大于4的偶数都可以分解成两个奇素数的和。 有些偶数有多个分解式,如: 10=3+7,10=5+5。,77,试求6744可以分解成多少个不同的分解式:6744=A+B(A=B)#144 基本算法 :主程序用单循环,78,解答,c= 6744 n=0 for a=3 to c/2 step 2b=c-aif prime
24、(a) and prime(b)n=n+1endif endfor ? n & 后接函数,79,双胞胎素数,若两个素数之差为2,则称此两数为双胞胎数。求出200, 1000之间的最大一对双胞胎数的和。#1764 基本算法:主程序用单循环 for a=200 to 1000-2,80,for a=200 to 1000-2if prime(a) and prime(a+2)s=2*a+2? a,a+2,sendif next ? s & 后接函数,81,友素数,若两个连续的自然数的乘积减1后是素数,则称此两数为友数对,该素数称为友素数。例如,由于 8*9-1=71, 因此,8与9是友数对,71是
25、友素数。求100,200之间的友数对的数目。#40,82,k=0 for n=100 to 200-1if prime(n*(n+1)-1)k=k+1endif next ? k & 后接函数,83,第一类超级素数,(不含0的)素数,且去掉前面一位或多位后仍是素数。如1223 基本算法:单循环 循环处理:求有关数、判断素数 对三位数x:y=x-int(x/100)*100 对四位数x:y=x-int(x/1000)*1000,84,求100,9999内第一类超级素数个数。 可分别求出100,999和1000,9999的个数 下面求1000,9999内的个数。#99。,85,程序,clear n
26、=0 for x=1000 to 9999y=x-int(x/1000)*1000z=x-int(x/100)*100w=x-int(x/10)*10if not(0$str(x) and prime(x) and prime(y) and prime(z) and prime(w)? xn=n+1endif endf ? n & 后接函数,86,第二类超级素数,(不含0的)素数,且去掉后面一位或多位后仍是素数。如2333 基本算法:单循环 循环处理:求有关数、判断素数 y=int(x/10) z=mod(y/10),87,求100,9999内第二类超级素数个数。 可分别求出100,999和1
27、000,9999的个数 下面求1000,9999内的个数。#16,88,程序,clear n=0 for x=1000 to 9999y=int(x/10)z=int(y/10)w=int(z/10)if not(0$str(x) and prime(x) and prime(y) and prime(z) and prime(w)? xn=n+1endif endf ? n & 后接函数,89,12、猴子选大王,教材上例题(可耐心点,手工求) n个人围坐一圈,并顺序编号1n,从1号开始数,每数到m个就让其出局,重复.。求最后出局者的编号。 当n=50,m=3时 ,答案为11,90,谢谢!,祝考试顺利!,