常用算法与VFP程序第1页共8页1.求最大、最小数问题Dimex(30)Maxx=0&&极小数Minx=300&&极大数Fork=1to30X(k)=1+rand()*300Ifx(k)maxxMaxx=x(k)EndifIfx(k)minxMinx=x(k)Endif??x(k)&&顺序输出30个随机数endfor?maxx,minx2.最大公约数和最小公倍数问题InputtoxInputtoyM=xN=yR=x%yDowhileR0X=yY=RR=x%yEnddo?y,M*N/y3.素数(质数)问题InputtoxFork=2tox-1Ifx%k=0exitendifendforifk=x?x,”isprime”Else?x.”notprime”endif4.阶乘问题InputtoxF=1Fork=xto2step-1F=f*k常用算法与VFP程序第2页共8页Endfor?F5.百钱百鸡问题fori=0to33forj=0to50k=100-i-jif3*i+2*j+int(0.5*k)=100?i,j,kendifendforendfor6.倍数问题一个正整数与3的和是5的倍数,与3的差是6的倍数,编程序求出符合此条件的最小正整数。num=1doWhile(num+3)%50or(num-3)%60num=num+1enddo?num7.判断回文数AccepttosL=len(s)Fork=1toint(L/2)ifsubs(s,k,1)subs(s,L-k+1,1)exitendifEndforIfk=int(L/2)?s,”不是回文数”else?s,”是回文数”endif8.完全数(因数和)问题所谓“完全数”是指一个数恰好等于它的所有因子之和,例如,6=1+2+3,6是“完全数”。编程序求1000以内的“完全数”ClearForn=1to1000m=0fori=1ton-1ifn%i=0m=m+iendifendforifm=n常用算法与VFP程序第3页共8页??nendifendfor9.二-十进制数转换inputton&&输入一个二进制数s=0k=0dowhilen0s=s+n%10*2^kk=k+1n=int(n/10)enddo?s10.十-二进制数转换dimes(30)L=1inputtode&&输入一个十进制数dowhilede0s(L)=de%2de=int(de/2)L=L+1enddofori=L-1to1step-1??str(s(i),1)endfor11.常用级数生成与求和(1)已知数列{an}满足a1=1,an=a1+2a2+3a3+….+(n-1)an-1(n≥2)。请编写程序,求出a1000的值。A=1n=2doWhilen=1000A=A+(n-1)*An=n+1enddo?A(2)计算:Sn=a+aa+aaa+…+aaaa…aa(最后一个为n个a)比如,当n=4,a=3的时候,则为计算:s=3+33+333+3333InputtonInputtoaS=aT=aForI=2tonT=T*10+as=s+T常用算法与VFP程序第4页共8页endfor?s其它级数求和问题,请参考辅导资料12.二分法求高阶方程的根x1=-10x2=10Eps=10^-5dowhile.t.x0=(x1+x2)/2fx0=fun(x0)fx1=fun(x1)if(fx0*fx10)x2=x0elsex1=x0endififabs(fx0)Epsexitendifenddo?root=,x0procefunparakreturn2*k^3-4*k^2+3*k-6(说明:请注意书写高阶方程函数,初始2分点值x1,x2)13.梯形积分法InputtoaInputtobEuler=2.718281828S=0i=0n=100h=(b-a)/nDoWhile(i100)T=h*(f1(a+i*h)+f1(a+(i+1)*h))/2.0s=s+Ti=i+1enddo?sProcef1paraxreturnEuler^(-x*x)(说明:实际求解时,请注意正确书写求积函数和等分数)14.冒泡排序常用算法与VFP程序第5页共8页fori=1toNforj=1toN-iif(a(j)a(j+1))temp=a(j)a(j)=a(j+1)a(j+1)=tempendifendforendfor(说明:该程序已知数组a的长度为N,并已经被赋值为乱数列)15.选择排序fori=1toN-1k=iforj=i+1toNif(a(j)a(k))k=jendifendforif(k!=i)temp=a(i)a(i)=a(k)a(k)=tempendifendfor(说明:该程序已知数组a的长度为N,并已经被赋值为乱数列)16.顺序查找input请输入被查找的整数值:tokeyfori=1toNif(a(i)=key)flag=1exitendifendforif(flag=1)?查找成功,共进行了,i,次比较else?数据集合中不存在被查找数据Endif(说明:该程序已知数组a的长度为N,并已经被赋值为乱数列)17.折半查找flag=0low=1high=NInput“请输入查找关键字:”tokey常用算法与VFP程序第6页共8页Dowhilelow=highmiddle=(low+high)/2ifkey=a(middle)flag=1exitelseifkeya(middle)low=middle+1elsehigh=middle-1endifendifenddoifflag=1?查找成功else?数据集合中不存在被查找数据”endif(说明:该程序已知数组a的长度为N,并已经被赋值为有序数列)18.有序数列插入InputtoxFori=1toNif(A(i)=x)exitendifendforIf(i=n)fork=ntoistep-1A(k+1)=A(k)endforendifA(i)=x(说明:该程序已知数组a的长度为N,并已经被赋值为有序数列)19.有序数列删除InputtoxFori=1toNif(A(i)=x)exitendifendforIf(i=n)fork=itonA(k)=A(k+1)endfor(说明:该程序已知数组a的长度为N,并已经被赋值为有序数列)常用算法与VFP程序第7页共8页20.矩阵转置dimea(N,M),b(M,N)fori=1toNforj=1toMb(j,i)=a(i,j)endforendfor(说明:已知M,N作为数组的行数和列数,假设数组a已经被赋值)21.矩阵旋转dimea(R,R),b(R,R)fori=1toRforj=1toRb(R+1-i,R+1-j)=a(i,j)endforendfor22.递归算法(1)阶乘的递归?fac(5)Procfacparaxifx=1return1endifreturnfac(x-1)*x(2)最大公约数递归?gcd(16,24)Procgcdparam,nifm%n=0returnnelsereturngcd(n,m%n)endif(3)求逆串dostrRwithsa,1,20procstrRparass,a,blocaltifabreturnelsedostrRwithss,a+1,b-1t=ss(a)ss(a)=ss(b)常用算法与VFP程序第8页共8页ss(b)=tendif(说明:sa是一个存放字符串的数组。参数ss,a,b说明接受一个数组,从1至20个字符求其逆串,结果仍然放在数组sa中)23.字符串处理(1)插入(将子串s1插入主串s中,插入位置L)ProcINS_STRParas1,s,LIfL=1andL=len(s)+1s0=subs(s,1,L-1)+s1returns0+subs(s,L)endif(2)删除(将子串s1从主串s中删除)ProcDEL_STRParas1,sIfAT(s1,s)0ifAT(s1,s)=1s=subs(s,len(s1)+1)elses0=subs(s,1,AT(s1,s)-1),s=s0+subs(s,AT(s1,s)+len(s1))endifendifreturns(3)比较(输入:s1,s2。如果两串相等返回0,s1s2返回1,否则返回-1)ProcCMP_STRParas1,s2N=1DoWhileN=len(s1)x=asc(susb(s1,N,1)-asc(susb(s2,N,1)ifx0thenexitN=N+1enddoIfx0return-1elseifx0return1elsereturn0endifendif