计算机程序方法及习题.docx
- 文档编号:30044717
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:94
- 大小:53.09KB
计算机程序方法及习题.docx
《计算机程序方法及习题.docx》由会员分享,可在线阅读,更多相关《计算机程序方法及习题.docx(94页珍藏版)》请在冰豆网上搜索。
计算机程序方法及习题
计算机程序方法
一、过关要求
1. 程序设计能力:
(1) 了解程序设计基本概念和步骤,掌握正确的程序编制方法;
(2) 掌握利用程序控制结构进行算法设计,能利用一门程序设计语言编制程序;
(3) 掌握程序设计的基本算法及基本技术。
熟练掌握穷举法、递推法在算法中的应用机制;了解迭代法思想;熟练掌握取整函数与求余函数在数字分离、整数判断、奇偶判断、素数判断、素因数、局部截取等方面的应用;
(4) 掌握正确的阅读、静态分析算法的方法和技术,能完善残缺的程序。
2. 上机能力:
(1) 掌握现场编写程序解决问题的方法及步骤;
(2) 熟练掌握调试程序并排除错误的技术。
二、要点提示
程序结构包括数据结构和控制结构两个方面。
数据结构是描述用于程序的数据类型数目及构造方法。
在各种程序设计语言中大多提供了整数、实数、字符、数组等类型的数据,以及由这些类型构造出其他复杂的数据结构。
程序控制结构用于规定程序流程的方法和手段。
程序控制结构有顺序结构、分支(选择)结构和循环(重复)结构三种基本结构,由它们组成的程序称为结构化程序。
所谓结构程序设计方法就是用顺序、分支和循环三种基本结构来实现算法,编写程序并使程序设计各个环节结构化。
结构程序设计坚持模块化和自顶向下逐步求精的设计原则。
算法是一个过程,它由一组清晰的规则组成,这些规则指明了特定类型问题解答的一个操作顺序。
算法的效率决定着程序的效率,算法的优劣直接影响着程序的质量及推广应用。
通常,求解一个问题的过程往往有它的规律性。
常用的规律有穷举法、递推法及迭代法。
对穷举法,需要找出穷举的规则;对递推法,需要找出递推规律;对迭代法,需要先从数学上找到迭代公式。
具体到问题的细节,又往往需要研究数字间的规律。
数字分离、素数判断、因子分解、整数判断、奇偶判断、最大公约数、找最大(小)数、局部截取、数字精度转换等都是在解决实际问题过程中需要掌握的方法。
解题指导
一、程序设计概论
如何学好程序设计呢?
1、 重视算法设计
在一开始学习程序设计的时候,就应注意培养重视算法设计、乐于在改进算法上下功夫的良好习惯。
那些一看题目就直接写程序的人,不值得效法。
2、 构造能力的培养
构造性能力即发现新方法、新规律的能力。
在程序设计时,争取逐步掌握类比、归纳的方法,主动训练从各种特例中归纳出算法(设计算法)的能力。
3、 阅读好的程序
创作从模仿开始。
“读”即是借鉴。
在阅读中开窍,在借鉴中领悟。
善于借鉴常成为善于编程的先导。
尽量多读经典程序。
4、 使用正确的程序设计方法
结构程序设计有两种重要手法,即分解和抽象。
分解的含义是将一个复杂的问题分割成若干个小的、较容易解决的部分,然后分别进行处理。
抽象是突出“做什么”,而将“怎么做”往后放一放。
5、 在操作中学习
操作学习,主要靠上机编程、调试程序、最终运行程序得到正确结果。
在实践中不断总结经验,由量变到质变,从而形成一种能力。
分析问题,提出相应的数学模型,写出正确的算法,并在相应的程序语言环境中进行运算,以得到正确结果。
例题
例1.1 百马百瓦问题:
大马、小马和马驹共100匹,大马一驮三,小马一驮二,马驹二驮一,共100片瓦一次驮完,三种马都驮,共有多少种组合?
(答案:
6)
分析:
设大马数为x,小马数为y,则马驹数为100-x-y,另外还有等式:
3x+2y+(100-x-y)/2=100,化简为5x+3y=100(其中x和y均为正整数,且100-x-y>0)。
例1.2 最大公约数问题:
设给定两个自然数x和y,计算它们的最大公约数。
例1.3 有50个学生一起买小吃,共花钱200元,其中每个大学生花5元,每个中学生花3元,每个小学生花2元,问大、中、小学生的人数分配共有多少种不同的解(去掉某类学生为0的)?
(答案:
8)
例1.4 求100~999之间的水仙花数(一个数的值正好为自身各位立方之和,如:
153=13+53+33)的个数。
(保留整数位)(答案:
4)
例1.5 求〔1,120〕之间的所有整数的平方和。
(答案:
583220)
例1.6 试写一算法,自大至小依次输出顺序读入的三个整数x、y和z的值。
二、解题须知
1、 编程的步骤
(1) 审清题目。
把要解决的问题,所涉及的输入数据及需要的结果弄明白。
(2) 设计解题算法。
确定怎样解决问题,注意分析问题中的关键语句,确保理解问题,然后提出解题的数学模型。
在此,可充分发挥程序流程图对程序设计的辅助作用。
2、 解题及编程需要注意的问题:
数学模型要符合题意,算法要正确、切实可行。
例2.1 张某和他的孙子同出生于20世纪,他的孙子与他的年龄之差为60岁,张某和他的孙子出生年份被3、4、5、6除,余数都分别是1、2、3、4。
编程求出张某和他孙子各出生在哪一年。
(答案:
张某1918,他孙子1978)
分析:
他们的年份都分别减1、2、3、4而分别都能被3、4、5、6整除。
例2.2 编程找出互不相同的四个自然数,它们之中任意两数之和为偶数,任意三数之和可以被3整除,而且这四个数的和越小越好。
(已知它们的和不会大于50)
分析:
‘它们之中任意两数之和为偶数,任意三数之和可以被3整除’,可知,这四个不同的自然数是同奇或同偶的。
由‘已知它们的和不会大于50’可知最小的数小于10,最大数不超过41,次大数不超过22,次小数不超过14。
(答案:
1,7,13,25)
例2.3 求解下列方程x的值。
(保留整数位)(答案:
x为3)
x+y=7
x^2+2y^2=41
分析:
由第二个式子可知:
x<7,y<=3。
例2.4 求y=2x^4-3x^3-2x^2+5*x-6的y值,已知x=3.4
程序1
Settalkoff
X=3.4
Y=2*x^4-3*x^3-2*x^2+5*x-6
?
y
Settalkon
Return
这个程序运行速度很慢,因为乘方运算很费时,一次乘方的时间相当于50次加法运算,或进行16次乘法运算的时间。
可对算式化简成只有加法、乘法的式子:
y=(((2x-3)x-2)x+5)x-6
程序2
Settalkoff
X=3.4
y=(((2*x-3)*x-2)*x+5)*x-6
?
y
Settalkon
Return
习题
习题2.1 一物体以v0初速度水平射出,此时物体离地面高度为h,求物体的水平射程s(公式s=v0*sqrt(2*h/g),g=9.8米/秒^2。
编程实现当h=10米,v0为1米/秒、2米/秒……100米/秒时,物体相应的水平射程。
Settalkoff
Forv=1to100
S=v*sqrt(2*10/9.8)
?
?
v,s
Endfor
Settalkon
Return
习题2.2 一球从100米高处落至平地,并且连续多次再反弹再落下,假设每次反弹的高度都是前一高度的3/4倍,编程求出最大的自然数n,使得此球从开始下落至第n次着地时在垂直方向所经过的总路程不超过590米。
习题2.3 有5羊4犬3鸡2兔值钱1496,4羊2犬6鸡3兔值钱1175,3羊1犬7鸡5兔值钱958,2羊3犬5鸡1兔值钱861,求鸡值多少钱?
算法设计中常用的模型和技巧
一、循环的应用
1. 累加模型
例3.1 编写程序,已知s=1+3+5+7+9+…,求s不大于1000的最大值。
(答案:
961)
例3.2 已知s1=1,s2=1+2,s3=1+2+3,……,sn=1+2+3+…+n,编程求s1+s2+…+s1120的和(答案:
234782240)
例3.3 求y=1-1/2+1/3-1/4+1/5…前30项之和。
要求:
按四舍五入的方法精确到小数点后第二位。
(答案:
0.68)
例3.4 编程求如下表达式当n=20时的值。
(保留6位小数)(答案:
6.506583)
S=sqrt(ln
(1)+ln
(2)+ln(3)+…+ln(n))
2. 累乘模型
例3.5 求1*2*3*4*5…,当积大于77777720时退出循环。
(答案:
479001600)
例3.6 求s=14!
+15!
+16!
+17!
+18!
。
(答案:
6780378776371200)
例3.7求表达式s=1+1/3+(1*2)/(3*5)+(1*2*3)/(3*5*7)+…+(1*2*3*…*n)/(3*5*7*…*(2*n+1))当n=40时,s的结果(保留10位小数)。
(答案:
1.5707963268)
例3.8 计算y=x/1!
-x^3/3!
+x^5/5!
-x^7/7!
+…前20项的值(已知:
x=2)。
要求:
按四舍五入的方式精确到小数点后第二位。
(答案:
0.91)
settalkoff
clear
x=2.0000
d=0.0000
t=1
y=0.0000
fori=1to20
k=1
l=2*i-1
forj=1tol
k=k*j
endfor
d=t*(x^l/k)
y=y+d
t=(-1)*t
endfor
?
round(y,2)
settalkon
return
3. 终止循环的条件
例3.9 求出100以内使得算式1/(1*1)+1/(2*3)+…+1/(n*(2*n-1))的值大于1.35的最小的自然数n。
(答案:
14)
例3.10 求级数1/(1*2)+1/(2*3)+…+1/(n*(n+1))的和的近似值,直到级数中有一项的值小于1E-4为止。
要求:
按四舍五入的方式精确到小数点后第二位。
(答案:
1.00)
settalkoff
clear
s=0.0000
forn=1to10000
a=n*(n+1)
ifa<1e-4
exit
else
s=s+1/a
endif
endfor
?
round(s,2)
settalkon
return
习题三
1. 编写程序,已知:
s=1+3+5+7+9+…,求s不大于9000的最大值。
2. 已知s1=1,s2=1+2,s3=1+2+3,…,sn=1+2+3+…+n,编写程序求s1+s2+s3+…+s1620的和。
3. 已知s1=2,s2=2+4,s3=2+4+6,s4=2+4+6+8,…,编写程序求s=s1+s2+s3+…+s20的和。
4. 当m的值为50时,计算下列公式的值:
t=1-1/2-1/3-1/4-…-1/m。
要求按四舍五入的方式精确到小数点后第四位。
5. 编程求s=1!
+2!
+3!
+4!
+5!
+…+19!
。
6. 求出100以内最小的自然数n,使得从1开始的连续n个自然数的平方和大于5500。
二、数字问题
下面研究整数的一些自身性质与互相关系的处理方法。
处理方法的手段是利用取整函数和求余函数。
取整:
Int(x):
取x的整数部分,如int(5.6)=5,int(-1.9)=-1。
Floor(x):
取不大于x的最大整数。
如floor(5.6)=5,floor(-1.9)=-2
Ceiling(x):
取不小于x的最小整数。
如ceiling(5.6)=6,ceiling(-1.9)=-1
求余:
定义:
若a,b为任意整数,且b≠0,则存在唯一的整数q和r,使a=bq+r,0≦r﹤|b|。
q和r分别称为a/b的商和余数。
在VisualFoxPro环境中可使用内部函数MOD(a,b)(或%运算符)求得余数。
但考试过程中,往往是使用取整函数来完成求余过程的。
此时商可以由下式求得:
INT(a/b)+1,当b﹤0且a/b非整数
INT(a/b),其他情况
而余数总是由a-b*q求出。
当a,b都是自然数时商q可简单地由INT(a/b)求出。
在TC环境中,整数求余可用%运算符求得,浮点数可用函数fmod(a,b)求得。
1. 整除、整数的判断
设a、b是任意整数,且b≠0,如果能找到一个整数q,使a=b*q,则称a能被b整除。
在VisualFoxPro环境中,可采用的手段是:
(1) 利用取整函数判断:
当INT(a/b)=a/b时,a能被b整除。
(2) 利用求余函数判断:
当MOD(a,b)=0时,a能被b整除。
在TC环境中,可采用的手段是:
(1) 利用整除运算判断:
当(a/b)*b==a时,a能被b整除;
(2) 用求余方法判断:
当a%b==0时,a能被b整除。
也可以用函数fmod(a,b)==0进行判断。
作为特例,当b=1时就变成判断a是否为整数了。
例3.11 编程求[1,500]之间能被3或5整除的数之和。
(答案:
58418)
Settalkoff
Sum=0
Fori=1to500
Ifmod(I,3)=0ormod(I,5)=0
Sum=sum+1
Endif
Endfor
?
s
Settalkon
return
例3.12 编程在1,2,3,…,70中,任选两个不同的数,求它们的和为能被4和9整除的对数(3+5和5+3认为是同一对数)。
(答案:
67)
例3.13 编程求出[10,1000]内所有能被6和9中的一个且只有一个数整除的整数的个数。
(答案:
165)
例3.14 编程计算并输出2500以内的最大的10个能被13和17整除的自然数之和。
(答案:
14365)
2. 余数的应用
余数常用于截取尾部若干个数。
如欲取出2345的后2位数,可用2345%100求得。
一般地,欲取某数x的后m位数,则可用x%(10^m)求得。
例3.15 若一个自然数恰好是它的平方的末后几位数,则称此数为自同构数。
如5和76都是自同构数,因为它们的平方分别是25和5776。
求[2,99999]内所有自同构数之和。
(答案:
101114)
Settalkoff
Clear
Sum=0
Forx=2to99999
Y=x*x
M=len(ltrim(str(x)))
Ifmod(y,10^m)=x
Sum=sum+x
Endif
Endfor
?
sum
Settalkon
return
例3.16 编程求[2000,20000]之间同时满足除以7余5,除以5余3,除以3余1的整数的个数。
(答案:
171)
3. 奇偶判断
奇偶判断是整除判断的一个应用。
判断a是否是偶数就是判断a是否能被2整除。
判断a是否是奇数就是判断a+1是否是偶数。
在VisualFoxPro环境中,当int(a/2)=a/2或mod(a,2)=0时,a是偶数;而当int((a+1)/2)=(a+1)/2或mod(a+1,2)=0时,a是奇数。
在TC环境中,以a%2==0或fmod(a,2)==0或(a/2*2-a)==0或 !
(a/2)为依据进行偶数判断。
奇数判断则以(a+1)%2==0或fmod(a+1,2)==0或((a+1)/2*2-(a+1))==0或(a/2)为依据。
例3.17 求500到2156之间的所有偶数的平方和。
(答案:
1651918456)
分析:
500是偶数,以后每隔一个数(即加2)是偶数。
例3.18 求1到20之间的所有奇数之和与所有偶数之积并显示奇数之和与偶数之积。
4. 数字分离
分离自然数A各位数字的过程是一个不断对A除以10求商和余数的过程。
其算法如下:
S(0) 若A<1,则分离结束;
S
(1) 求A除以10的商Q和余数R,R为一分离数字;
S
(2) 调整A使A=Q;
S
(2) 转到S(0)。
这个算法分离A的各位数字是从个位开始,直到A的最高位。
若设A的位数是N,则将各位分离后存放在不同的变量中。
例3.19 “水仙花数”是指一个三位数,其各位数字的立方和等于该数本身,例如:
153=13+33+53,故153是水仙花数,求[100,999]之间的所有水仙花数之和。
(答案:
1301)
例3.20 编写程序,求共有几组i,j,k符合算式ijk+kji=1534,其中i,j,k是[0,9]之间的一个整数且i (答案: 2) 例3.21 回文指的是正读和反读都一样的一串字符,如121、1221。 编程求出[1234,9876] 内回文数的个数。 (答案: 85) 例3.22 计算出所有二至五位数字以内的回文个数。 (答案: 1089) settalkoff clear sum=0 fori=11to99999 L=len(alltrim(str(i))) docase caseL=2 a=int(i/10) b=mod(i,10) ifa=b sum=sum+1 endif caseL=3 a=int(i/100) b=mod(i,10) ifa=b sum=sum+1 endif caseL=4 a=int(i/1000) b=int((i-a*1000)/100) c=int(mod(i,100)/10) d=mod(i,10) ifa=dandb=c sum=sum+1 endif caseL=5 a=int(i/10000) b=int(mod(i,10000)/1000) c=int(mod(i,100)/10) d=mod(i,10) ifa=dandb=c sum=sum+1 endif endcase endfor ? '2到5位数中,回文数的个数为: ',sum settalkon return 例3.23 编程求四位数的奇数中,所有各位数字之积(且不为0)是125的倍数的数的和。 (答案: 161095) 例3.24 编程求最小的一个四位整数N,它的九倍恰好是其反序数(反序数就是将整数的数字倒过来形成的数,如1234的反序数为4321)。 (答案: 1089) 例3.25 求出[123,789]内至少有两个数字相同的数的个数。 (答案: 180) 例3.26 求出 [1234,2345]内恰好有两位数字是6的所有整数之和。 (答案: 124266) 例3.27 若一个四位正整数是另一个正整数的平方,且各位数字的和是一个平方数,则称该四位正整数是“四位双平方数”。 例如: 由于7396=862,且7+3+9+6=25=52,则称7396是“四位双平方数”。 若把所有“四位双平方数”按升序排列,求前10个“四位双平方数”的和。 (答案: 29690) settalkoff clear s=0 n=0 fori=1000to9999 a=int(i/1000) b=int((i%1000)/100) c=int((i-a*1000-b*100)/10) d=i%10 k=.f. forj=30to99 ifi=j*j k=.t. endif endfor ifint(sqrt(a+b+c+d))=sqrt(a+b+c+d)andk s=s+i n=n+1 endif ifn>=10 exit endif endfor ? s settalkon return 例3.28 有一个三位数满足下列条件: (1)此三位数的三位数字各不相同; (2)此三位数等于它的各位数字的立方和。 试求第二大的数是多少。 (答案: 371) 5. 素数判断 大于1且除1和它本身外无其他正因数的自然数叫做素数(也叫质数)。 判断大于1的自然数A是否是素数的算法思想为: 让A被2到sqrt(A)除,如果A能被2到sqrt(A)之中任何一个整数整除,则说明该数不是素数,否则该数是素数。 例: 判断501是不是素数,算法如下: Settalkoff Clear A=501 K=.f. Fori=2tosqrt(A) ifmod(A,i)=0 k=.t. exit endif endfor ifk ? A,'不是素数。 它有一个因子为',i Else ? A,'是素数。 ' Endif Settalkon Return 例3.29 德国数学家哥德巴赫曾猜测: 任何大于6的偶数都可以分解成两个素数(素数对)的和。 但有些偶数可以分解成多种素数对的和,如10=3+7,10=5+5,即10可以分解成两种不同的素数对。 试求1234可以分解成多少种不同的素数对。 (注: A+B与B+A认为是相同的素数对)(答案: 25) 例3.30 [100,999] 范围内同时满足以下两个条件的十进制数: (1)其个位数字与十位数字之和除以10所得的余数是百位数字;该数是素数。 求有多少个这样的数? (答案: 15) settalkoff clear n=0 fori=100to999 a=int(i/100) b=int(mod(i,100)/10) c=mod(i,10) F=.f. forj=2tosqrt(i) ifmod(i,j)=0 F=.f. exit else F=.t. endif endfor ifFandmod(b+c,10)=a n=n+1 endif endfor ? n settalkon return 例3.31 两个素数之差为2,则称这两个素数为双胞胎数。 求出[200,1000] 之间的最大一对双胞胎数的和。 (答案: 1764) settalkoff clear k=.f. fora=1000to202step-1 b=a-2 forc=2tosqrt(a) ifmod(a,c)=0ormod(b,c)=0 k=.f. exit else k=.t. d=a e=b endif endfor ifk ? 'a=',d,'b=',e,'a+b=',a+b exit endif endfor if! k ? '没有满足要求的一对双胞胎数! ' endif settalkon return 例3.32 梅森尼数是指能使2n-1为素数的数n,求[1,21]范
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 程序 方法 习题
