V F P程序设计题复习资料
●一求某范围内满足某种条件的问题(整除)
例:求出[10,1000]以内同时满足除以7余5,除以5余3,除以3余1
的所有整数的个数。
●源程序如下:
●Set talk off
●S=0 *为求个数设立一个变量
●For I=10 to 1000
●If I%7=5 and I%5=3 and I%3=1
●S=s+I
●Endif
●? s *在屏幕上显示出结果
练习:
●1. 编程序求1~60 所有整数的平方和并输出结果。
●2. 编程序求1~85 的平方根和并输出结果。(保留小数点两位)
●3. 编程序求出100 到200 之间同时满足除3 余2 和除5 余
3 条件的数的个数。
●4. 编程序求出1 到4000 之间的能被5 整除的前若干个偶数之和,当和大于400 时退出并输出结果。
●5. 求[3333 ,6666] 之间所有能被5 整除同时能被7 整除的数, 问共有多少个这样的数?
二数字分离
●源程序如下:
●Sum=0
●Clear
●For I=1001 to 9999 step 2
●a4=int(i/1000) *取第四位上的数字
●a3=int(i/100)%10
●a1=i%10
●If (a1+a2+a3+a4)%15=0
●Sum=sum+I
●Endif
●Endfor
●? sum
●return
例2:求[100,10000]中其各位数字之和能被7整除的数的个数●源程序如下:
●Set talk off
●S=0 *用来记数的变量,定义在循环体外
●For i =1000 to 9999
●A4=int(i/1000) *取第四位上的数字
●A3=int(i/100%10)
●A2=int(i/10%10)
●A1=i%10
●If (a1+a2+a3+a4)%7=0 *满足的条件表达式
●S=s+1 *求个数累加1
●Endif
●Endfor
●?s *在循环结束后在显示要求的个数
例3:回文数是指正读和反读都一样的正整数。例如3773等都是回文数。所谓回文数是从左至右或从右至左读起来都是一样的数字,如:121是一个回文数。编写程序,求在1000—9000
的范围内所有回文数个数。
●
●源程序如下:
●clear
●s=0
●stor 0 to a,b,c,d,i
●for i=1000 to 9999
●a=int(i/1000)
●b=int(i/100%10)
●d=i%10
●if a=d and b=c
●s=s+1
●endif
●endfor
●? s
●return
例4:一个数出现在该数的平方数的右边,称这个数为“同构数”。例如,5出现在平方数25的右边,25出现在平方数625的右边,则5、25都是“同构数”。找出[1,1000]之间的所有“同构数”的个数。
●
●源程序如下:
●Clear
●S=0
●For I=1 to 1000
●B=I**2
●If b%10=I or b%100=I or b%1000=I
●S=s+1
●Endif
●Endfor
●? s
●return
例5:若某整数N的所有因子之和等于N的倍数,则N称为多因子完备数,如数28,其因子之和
1+2+4+7+14+28=56=2*28,28是多因子完备数。求[1,200]之间有多少个多因子完备数。求在[10,1000]之间的所有完备数之和。各真因子之和(不包括自身)等于其本身的正整数称为完数。例如:6=1+2+3,6是完
数。
●
●源程序如下:
●Clear
●K=0
●Sum=0 *用来保存结果即完数的和
●For k= 10 to 1000
●S=k
●For I=1 to k-1
●If (k%i)=0 &&满足条件的表示I是k的一个因子
●S=s-I &&将数k减去它的所有因子
●Endif
●Endfor
●If s=0 &&s等于零表示s减去所有因子后为零,满足完数的条件
●Sum=-sum+k
●Endif
●Endfor
●?sum
●return
例6:求五位数各数字的平方和为100的最大的五位数。
?
●源程序如下:
●Clear
●For I=99999 to 10000 step –1
●A5=int(i/10000)
●A4=int(i/1000%10)
●A3=int(i/100%10)
●A2=int(i/10%10)
●A1=I%10
●If a5**2+a4**2+a3**2+a2**2+a1**2=100
●?I
●break &&因为循环是从大到小,找到第一个即可跳出
●endif
●endfor
练习:
●1、已知24有8个因子(即:1,2,3,4,6,8,12,24),而24正好被8整除。求[100,300]之间所有能被其因子数目整除的数之和。
●2、编写程序,求在四位数的偶数中,所有各位数字之积(且不为0)是18的倍数的数的和
●3、一个数如果刚好与它所有的因子之和相等,则称该数为一个“完数”,如:6=1+2+3,则6就是一个完数。求出1000以内的所有的完数之和。
●4、设某四位数的千位数字与十位数字的和等于百位数字与个位数字的积,例如,对于四位数:9512,9+1=5*2,试问所有这样的四位数之和是多少?
●5、设某四位数的千位数字的平方与十位数字的平方之和等于百位数字的立方与个位数字的立方之和,例如,对于四位数:3201,3^2+0^2=2^3+1^3,试问这样的四位数有多少个?
●6、设某四位数的各位数字的立方和等于100,试问有多少个这样的四位数?
●7、若一个四位正整数是另一个正整数的平方,且各位数字的和是一个平方数,则称该四位正整数是“四位双平方数”。例如:由于7396=86^2,且7+3+9+6=25=5^2,则称7396是“四位双平方数”。求所有“四位双平方数”的个数。
三素数勾股数等
●
例1:编写程序,求一正整数等差数列的前五项的立方和,该数列前四项之和是26,之积是880。
●源程序如下:
●flag=0
●for dd=0 to 10
●for x=1 to 1000
●a=x
●b=x+dd
●c=x+2*dd
●d=x+3*dd
●e=x+4*dd
●if a+b+c+d=26 and a*b*c*d=880 then
●
●flag=1
●exit
●endif
●
●n ext x
●i f flag=1 then
●exit
●e ndif
●next d
●? a,b,c,d,e
●? a^3+b^3+c^3+d^3+e^3
例2:水仙花数是指这样的数,其各位数字的立方和等于该数
本身,
如:153=1^3+5^3+3^3。
编写程序,计算从100年开始到2000年为止,共有多少个年号
是水仙花数年号。
●
●源程序如下:
●n=0
●for year=100 to 2000
●a=mod(year,10)
●b=mod(int(year/10),10)
●c=mod(int(year/100),10)
●d=mod(int(year/1000),10)
●if year=int(a*a*a)+int(b*b*b)+int(c*c*c)+int(d*d*d) then
●n=n+1
●?a,b,c,d
●endif
●next year
●? n
例3:有些偶数可以分解成多种素数对的和,如:10=3+7,
10=5+5,
即10可以分解成两种不同的素数对。试求1234可以分解成多少
种不同的素数对
(注:A+B与B+A认为是相同素数对)
●源程序如下:
●clear
●store 1 to a,b,i,j
●store 0 to n,m
●for i=2 to 1234/2
●a=i
●b=1234-i
●if susu(a) and susu(b)
●n=n+1
●
●endif
●endfor
●?n
●function susu(x) &&验证一个数是不是一个素数
●for j=2 to int(sqrt(x))
●if x%j=0
●return (.f.)
●exit
●endif
●endfor
●if j>=int(sqrt(x))+1
●return (.t.)
●endif
●endfunc
四等差、等比、数列、阶乘、公式
●
例1:斐波那契数列的前二项是1,1,其后每一项都是前面两项之和,求:10000000以内最大的斐波那契数?
clear
●f1=1
●f2=1
●f3=f1+f2
●do while f3<10000000
●f1=f2
●f2=f3
●f3=f1+f2
●enddo
●?f2
●例2:计算y=1+2/3+3/5+4/7+…+n/(2*n-1)(n=50),
●*要求:按四舍五入的方式精确到小数点后第二位。
●源程序如下:
●clear
●y=0
●for n=1 to 50
●i=n/(2*n-1)
●y=y+i
●endfor
●?round(y,2)
练习:
●1、计算Y=X/1!-X^3/3!+X^5/5!-X^7/7!+…前20项的值(已知:X=2)。要求:按四舍五入的方式精确到小数点后第二位。
●2、利用格里高利公式:α/4=1-1/3+1/5-1/7+1/9-1/11+…-1/99,求α的值。要求:按四舍五入的方式精确到小数点后第二位。
●3、求1/(1*2)+1/(2*3)+1/(3*4)+….+1/(N*(N+1))的值,N=20, 要求:按四舍五入的方式精确到小数点后第二位。
●4、求1/2+2/3+3/5+5/8+……的前1000项的和(注:该数列从第二项开始,其分子等于前一项的分母,而其分母等于前一项分子与分母之和)。要求:按四舍五入的方式精确到小数点后第二位。
●5、求S=1*2+2*3+3*4+4*5+…+n*(n+1),当和
●大于2000001时退出程序,求此时的n的值。
●6、求Y=1-1/2+1/3-1/4+...-1/2*n 前30项之和。要求:按四舍五入的方式精确到小数点后第二位。
●7、求数列:2/1,3/2,5/3,8/5,13/8,21/13,……前50项之和(注:此数列从第二项开始,其分子是前一项的分子与分母之和,其分母是前一项的分子)。(按四舍五入的方式精确到小数点后第二位)
●8、求数学式1-1/2+1/3-1/4+1/5-1/6+…+1/99-1/100的值(按四舍五入方式精确到小数点后4位)
●9、已知一个数列的前3个数为0,0,1,以后每个数为前3个数的和,编程序求此数列的第36个数。(即f1=0,f2=0,f3=1,fn=f(n-3)+f(n-2)+f(n-1),如f4=f1+f2+f3 )
五穷举鸡兔同笼
●
●例1:30个学生一起买小吃,共花钱100元,其中每个大学生花5元,每个中学生花3元,每个小学生花1元,问大、中、小学生的人数分配共有多少种不同的解(去掉某类学生为0的解)?
●n=0
●for a=1 to 30
●for b=1 to 30
●for c=1 to 30
●if a+b+c=30 .and. a*5+b*3+c*1=100
●n=n+1
●endif
●endfor
●endfor
●endfor
●? n
●例2:50元兑换成5元、2元和1元的计算方法有多少种。
●note :fy,ty,oy为5元、2元、1元的张数
●note :n 为兑换的种数
●n=0
●for fy=0 to 10
●for ty=0 to 25
●for oy=0 to 50
●sum1=fy*5+ty*2+oy*1
●if sum1=50
●n=n+1
●endif
●next
●next
●next
●? "兑换的种数",n
六方程问题
●
练习:
●1、若(x,y,z)满足方程:x^2+y^2+z^2=55^2(注:要求x > y > z),则(x,y,z)称为方程的一个解。试求方程的所有整数解中,|x|+|y|+|z|的最大值。
●2、若(x,y,z)满足方程:x^2+y^2+z^2=55^2(注:要求x > y > z),则(x,y,z)称为方程的一个解。试求方程的所有整数解中x+y+z的最大值。
●3、若(x,y,z)满足方程:x^2+y^2+z^2=55^2(注:要求x > y > z),则(x,y,z)称为方程的一个解。试求方程的整数解(包括负整数解)的个数。
●4、已知S1=1, S2=1+2, S3=1+2+4, S4=1+2+4+8,S5=1+2+4+8+16,…,
编制一个程序求S=S1+S2+S3+S4+S5+…+S20的值。
●5、找满足以下条件: X^2+Y^2+Z^2=41^2 且X+Y+Z之值最大的三个正整数X,Y,Z, 求X+Y+Z之值.
七其它
●
例1:50个小学生按1至50序号顺时针围成一圈,做出局游戏,老师站在圈外逆时针从最后一个人数起,每数到5时,这人从圈里出来,继续数1,2,3,4,5,数到第5个学生时,他就出局,已出局的位置不再参加计数,直至所有的学生出局为止,问最后
一个出局的学生序号是多少号。
●
●note :n为每数到5时flag=1 为在圈内dime stu(50)为50个学生
●note :count1=1 为报数器count2=0记数器
●dime stu(50)
●N= 5
●flag=1
●for i=1 to 50
●stu(i)=flag
●next
●count1=1
●count2=0
●i=1
●flag=0
●do while count2<49
●if count1=N then
●count2=count2+1
●stu(i)=flag
●count1=1
●endif
●i=i+1
●if i=51 then
●i=1
●endif
●count1=count1+stu(i) ●enddo
●for i=1to 50
●if stu(i)=1 then ●?i
●endif
●endf
●