第2部分 常用过程.docx
- 文档编号:26134609
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:34
- 大小:25.26KB
第2部分 常用过程.docx
《第2部分 常用过程.docx》由会员分享,可在线阅读,更多相关《第2部分 常用过程.docx(34页珍藏版)》请在冰豆网上搜索。
第2部分常用过程
第二部分常用过程
实际编程时,常常在许多程序中需要用到一些通用过程。
例如,判断一个正整数是否为素数、是否为回文数、是否为升序数、是否为同构数、是否为平方数、是否为完数,求一个正整数的阶乘、反序数,求两个数的最大公约数、最小公倍数,十进制数转换为其它进制数、其它进制数转换为十进制数,求序列中的最大值及删除序列中的重复数等等。
本节中将用于完成这些功能的程序段组织成通用过程,其中有的题目给出了几种不同的做法,读者应熟练掌握这些过程的基本方法与技巧,在学习、理解的基础上熟记在心,在程序设计时可以直接调用。
2.1判断正整数是否为素数
分析:
所谓素数是指除了可被1和自身整除之外,不能被其它数整除的数。
1.函数过程一如下:
PrivateFunctionprime(nAsInteger)AsBoolean
DimiAsInteger
Fori=2ToSqr(n)
IfnModi=0ThenExitFor'判断能否整除
Nexti
Ifi>Sqr(n)Thenprime=True'条件满足则是素数
EndFunction
形参说明:
n为需要判断的正整数。
调用结束通过函数名prime返回判断结果。
2.函数过程二如下:
PrivateFunctionPrime(nAsInteger)AsBoolean
DimiAsInteger
Fori=2ToSqr(n)
Ifn/i=Int(n/i)ThenExitFunction'条件满足则不是素数
Nexti
Prime=True'是素数
EndFunction
形参说明:
n为需要判断的正整数。
调用结束通过函数名prime返回判断结果。
3.Sub过程如下:
PrivateSubprime(nAsInteger,fAsBoolean)
DimkAsInteger
Fork=2ToSqr(n)
IfnModk=0ThenExitSub'条件满足直接退出过程
Nextk
f=True'是素数
EndSub
形参说明:
n为需要判断的整数,f用于返回判断结果,f值为True,则n是素数;f值为False,则n不是素数。
由于Sub过程是通过传地址参数将结果传回调用程序,所以,本过程的形参f主要是为了回传值而增加的一个参数,调用前应给对应于形参f的实参赋值False。
2.2判断正整数是否为合数
分析:
所谓合数是指除了可被1和自身整除之外,还可被其它数整除的数。
如12是合数。
函数过程如下:
PrivateFunctionhs(nAsInteger)AsBoolean
DimiAsInteger
Fori=2Ton-1
IfnModi=0ThenExitFor
Nexti
Ifi<=n-1Thenhs=True'条件满足则是合数
EndFunction
形参说明:
n为需要判断的整数,调用结束通过函数名hs返回判断结果。
2.3判断正整数是否为回文数
分析:
所谓回文数是指形如ABA、ABCBA的数。
如121、23632均是回文数。
函数过程如下:
PrivateFunctionhw(nAsInteger)AsBoolean
DimiAsInteger,stAsString,strlenAsInteger
st=CStr(n)
strlen=Len(st)
Fori=1Tostrlen\2
IfMid(st,i,1)<>Mid(st,strlen+1-i,1)Then
ExitFunction'不是回文数
EndIf
Nexti
hw=True'是回文数
EndFunction
形参说明:
n为需要判断的整数,调用结束通过函数名hw返回判断结果。
2.4判断正整数是否为完数
分析:
所谓完数是指一个整数n的因子和(不包括n)等于n。
如6的因子为1、2、3,而6=1+2+3,因而6就是完数。
1.判断是否为完数
函数过程如下:
PrivateFunctionwanshu(nAsInteger)AsBoolean
DimiAsInteger,sumAsInteger
Fori=1Ton-1
IfnModi=0Then'条件满足是因子
sum=sum+i'累加因子
EndIf
Nexti
Ifsum=nThenwanshu=True'条件满足是完数
EndFunction
形参说明:
n为需要判断的整数,调用结束通过函数名wanshu返回判断结果。
2.将正整数的因子存入数组,并判断是否为完数
Sub过程如下:
PrivateSubwanshu(nAsInteger,a()AsInteger,fAsBoolean)
DimiAsInteger,kAsInteger,sumAsInteger
Fori=1Ton-1
IfnModi=0Then'条件满足是因子
k=k+1
ReDimPreservea(k)
a(k)=i'因子存入数组
sum=sum+i'累加因子
EndIf
Nexti
Ifsum=nThenf=True'条件满足是完数
EndSub
形参说明:
n为需要判断的整数,a数组用于保存得到的因子,f用于返回判断结果。
调用结束通过f的值即可得到结果,f值为True,则是完数,f值为False,则不是完数。
调用该过程前,应给对应于形参f的实参赋值False。
2.5判断正整数是否为升序数
分析:
所谓升序数是指一个整数n的各位数字是递增的。
如,123、369都是升序数。
函数过程如下:
PrivateFunctionsx(ByValnAsInteger)AsBoolean
Dima()AsInteger,kAsInteger,pAsInteger
DimiAsInteger
Do
p=nMod10'得到一位数
k=k+1
ReDimPreservea(k)
a(k)=p'将其存入数组
n=n\10'为下一循环做准备
LoopUntiln=0
Fori=2ToUBound(a)
Ifa(i)>=a(i-1)ThenExitFunction'条件满足不是升序数
Nexti
sx=True'是升序数
EndFunction
形参说明:
n为需要判断的整数,由于形参n的值在过程中发生了改变,所以声明为传值参数(在参数前加ByVal)。
调用结束通过函数名sx返回判断结果。
2.6判断正整数是否为平方数
分析:
所谓平方数是指满足关系式Int(Sqr(n))=Sqr(n)的数。
如,121、144均是平方数
Sub过程如下:
PrivateSubsquare(nAsLong,fAsBoolean)
Ifn>0Then
IfInt(Sqr(n))=Sqr(n)Then'条件满足是平方数
f=True
ExitSub
EndIf
EndIf
f=False'不是平方数
EndSub
形参说明:
n为需要判断的整数,f用于返回判断的结果。
调用结束通过f的值即可得到结果。
f值为True,则是平方数;f值为False,则不是平方数。
2.7判断正整数是否为同构数
分析:
若一个数出现在自己平方数的右端,则称此数为同构数。
如,25,76均是同构数。
函数过程如下:
PrivateFunctiontg(nAsInteger)AsBoolean
DimmAsLong,kAsInteger
k=Len(CStr(n))
m=n^2
IfRight(CStr(m),k)=CStr(n)Then'条件满足是同构数
tg=True
EndIf
EndFunction
形参说明:
n为需要判断的整数,调用结束后通过函数名tg得到结果。
2.8求正整数的阶乘
分析:
求阶乘的方法比较多,一般采用累乘及递归的方法实现。
1.函数过程一如下:
PrivateFunctionjc(nAsInteger)AsLong
Ifn=1Then
jc=1
Else
jc=jc(n-1)*n'递归调用
EndIf
EndFunction
形参说明:
n为需要求阶乘的整数。
由于阶乘值比较大,所以函数值的类型声明为Long。
该函数使用递归方法实现。
调用结束通过函数名jc返回结果。
2.函数过程二如下:
PrivateFunctionjc(ByValnAsInteger)AsLong
jc=1
DoWhilen>0
jc=jc*n'累乘
n=n-1
Loop
EndFunction
形参说明:
n为需要求阶乘的整数,由于过程中形参的值发生了改变,所以形参n声明为传值参数。
由于阶乘值比较大,所以函数值的类型声明为Long。
调用结束通过函数名jc返回结果。
3.函数过程三如下:
PrivateFunctionjc(nAsInteger)AsLong
DimiAsInteger
jc=1
Fori=2Ton
jc=jc*i'累乘
Nexti
EndFunction
形参说明:
n为需要求阶乘的整数。
由于阶乘值比较大,所以函数值的类型声明为Long。
该方法与上一种类似,均采用累乘实现,不过两个累乘的方向相反。
调用结束通过函数名jc返回结果。
2.9求最大公约数
分析:
求最大公约数的方法比较多,可以采用穷举法、欧几里得算法及递归算法等。
1.欧几里得算法,又称为辗转相除法
函数过程一如下:
PrivateFunctiongcd(ByValmAsInteger,ByValnAsInteger)AsInteger
DimrAsInteger
r=mModn
DoWhiler<>0
m=n:
n=r
r=mModn
Loop
gcd=n
EndFunction
形参说明:
m、n为需要求最大公约数的两个整数,由于过程中两个参数的值都发生改变,所以将两个参数都声明为传值参数。
调用结束通过函数名gcd返回结果。
2.递归算法
函数过程二如下:
PrivateFunctiongcd(ByValmAsInteger,ByValnAsInteger)AsInteger
DimrAsInteger
r=mModn'求余数
Ifr=0Then
gcd=n
Else
m=n:
n=r
gcd=gcd(m,n)'进行递归
EndIf
EndFunction
形参说明:
m、n为需要求最大公约数的两个整数,由于过程中两个参数的值都发生改变,所以将两个参数都声明为传值参数。
调用结束通过函数名gcd返回结果。
3.穷举算法
函数过程三如下:
PrivateFunctiongcd(mAsInteger,nAsInteger)AsInteger
DimiAsInteger
Fori=nTo2Step-1
IfmModi=0AndnModi=0ThenExitFor'条件满足时i即为最大公约数
Nexti
gcd=i
EndFunction
形参说明:
m、n为需要求最大公约数的两个整数。
该算法采用的是穷举算法,即从n开始试除m与n,如果不能整除,再用n-1试除,一直到1。
一旦其间某个数能整除m与n,它就是m与n的最大公约数。
穷举算法的一个缺陷是效率较低。
调用结束通过函数名gcd返回结果。
2.10求最小公倍数
分析:
求最小公倍数的方法比较多,可以采用穷举法、最大公约数(即用最大公约数求最小公倍数)算法等。
1.最大公约数算法
函数过程一如下:
PrivateFunctionLcm(mAsInteger,nAsInteger)AsInteger
DimiAsInteger,jAsInteger
Fori=nTo1Step-1
IfnModi=0AndmModi=0Then'条件满足时i为最大公约数
ExitFor
EndIf
Nexti
Lcm=m*n/i'最小公倍数为m*n/i
EndFunction
形参说明:
m、n为需要求最小公倍数的两个整数。
该算法采用的是最大公约数算法,即先求出最大公约数i,则m*n/i即为最小公倍数。
调用结束通过函数名Lcm返回结果。
2.试除算法
函数过程二如下:
PrivateFunctionLcm(mAsInteger,nAsInteger)AsLong
Do
Lcm=Lcm+n
IfLcmModn=0AndLcmModm=0Then'条件满足时Lcm为最小公倍数
ExitDo
EndIf
Loop
EndFunction
形参说明:
m、n为需要求最小公倍数的两个整数。
该算法采用的是试除算法,即用两个整数中任意一个数作为最小公倍数去试除两数,若能整除,则返回结果;若不能整除,则最小公倍数增加一倍,继续去除两数,直至能整除为止。
调用结束通过函数名Lcm返回结果。
3.穷举算法
函数过程三如下:
PrivateFunctionLcm(mAsInteger,nAsInteger)AsLong
DimiAsInteger,tAsInteger
Ifn>mThen
t=n:
n=m:
m=t'使得m>n
EndIf
Fori=mTom*nStepm'最小公倍数在m~m*n之间
IfiModn=0Then
Lcm=i'满足条件的第一个数为最小公倍数
ExitFor
EndIf
Nexti
EndFunction
形参说明:
m、n为需要求最小公倍数的两个整数。
算法:
不妨假设m>n,则m与n的最小公倍数应该在m~m*n之间,可以从m开始试除以n,如果m不能整除以n,再用m+m试,一直到m*n。
一旦其间某个m的倍数能够整除以n,它就是m与n的最小公倍数。
调用结束通过函数名Lcm返回结果。
2.11求正整数的逆序数
分析:
求正整数的逆序数的方法有两种:
数值算法及字符算法。
1.数值算法
函数过程一如下:
PrivateFunctionnx(ByValnAsInteger)AsInteger
DimkAsInteger,sAsString
Do
k=nMod10'依次得到一位数
s=s&CStr(k)'逆序字符累加
n=n\10'缩小位数
LoopUntiln=0
nx=s'为函数名赋值
EndFunction
形参说明:
n为需要求逆序数的正整数。
算法:
从整数个位数开始用取余法依次得到整数的每一位数,将其以逆序字符的形式累加到一个字符变量中。
调用结束通过函数名nx返回结果。
若对于2500这样的数,要求得到0025的形式,只要将函数值的类型声明为String即可。
2.字符算法
函数过程二如下:
PrivateFunctionnx(nAsInteger)AsInteger
DimkAsInteger,sAsString,stAsString
s=CStr(n)'转换为数字串
Fori=Len(s)To1Step-1
st=st&Mid(s,i,1)'字符累加
Nexti
nx=st'为函数名赋值
EndFunction
形参说明:
n为需要求逆序数的正整数。
算法:
将整数转换为字符形式,利用循环依次得到字符串的每一位数,将其累加到一个字符变量中。
调用结束通过函数名nx返回结果。
2.12分离正整数的各位数到数组并求和
分析:
经常会遇到需要将一个正整数的各位数字分离出来的情况,下面的Sub过程实现该功能。
采用的方法是依次得到(取余法)每一位数,将其存放到数组中。
计算整数各位数字之和与分离整数的各位数很类似,不同的是得到每一位数后直接相加即可,下面的函数过程实现该功能。
1.分离正整数的每位数
Sub过程如下:
PrivateSubdv(ByValnAsInteger,p()AsInteger)
DimkAsInteger
Do
k=k+1
ReDimPreservep(k)
p(k)=nMod10'得到一位数并存入数组
n=n\10'为得到下一位数做准备
LoopUntiln=0
EndSub
形参说明:
n为需要分离的正整数,由于n的值在过程中发生了改变,所以将n声明为传值参数。
p为一数组,用于存放分离出的每一位数。
由于形参n的位数不定,所以形参p为一动态数组。
调用结束后通过数组p返回结果。
2.求正整数各位数字的和
函数过程如下:
PrivateFunctionfun(ByValnAsLong)AsInteger
DoWhilen>0
fun=fun+(nMod10)'得到一位数并进行数值累加
n=n\10'为得到下一位数做准备
Loop
EndFunction
形参说明:
n为需要求各位数的和的正整数。
由于n的值在过程中发生了改变,所以将n声明为传值参数。
利用循环依次得到每一位数,将其累加到一个函数名中。
调用结束通过函数名fun返回结果。
2.13判断整数的每位数字是否相同
分析:
判断的方法是将一个正整数的各位数字分离出来,并存放到一数组中,利用选择法判断是否有相同的元素。
函数过程如下:
PrivateFunctionValidate(nAsLong)AsBoolean
DimiAsInteger,pAsString,a()AsInteger,jAsInteger
p=CStr(n)
ReDima(Len(p))
Fori=1ToLen(p)
a(i)=Mid(p,i,1)'将每一位数字存入数组
Nexti
Fori=1ToUBound(a)-1'判断是否有相同的数
Forj=i+1ToUBound(a)
Ifa(i)=a(j)ThenExitFunction'有相同的数
Nextj
Nexti
Validate=True'没有相同的数
EndFunction
形参说明:
n为需要判断的正整数。
调用结束通过函数名Validate返回结果。
2.14分解质因数
分析:
经常需要分解出一个正整数的质因数,下面的factor过程实现该功能。
或者需要分解出一个正整数的不同的质因数,下面的zys过程实现该功能。
1.分解质因数到数组中
Sub过程一如下:
PrivateSubfactor(ByValnAsInteger,f()AsInteger)
DimiAsInteger,kAsInteger
Fori=2Ton-1
DoWhilenModi=0'条件满足是因数
k=k+1
ReDimPreservef(k)
f(k)=i'将其存入数组
n=n\i'将n缩小因数倍
Loop
Nexti
EndSub
形参说明:
n为需要分解因数的正整数,由于n的值在过程中发生了改变,所以将n声明为传值参数。
f数组用于存放找到的质因数,由于因数个数不确定,因此数组f应为一个动态数组。
调用结束通过数组f返回结果。
2.分解不同的质因数到数组中
Sub过程二如下:
PrivateSubzys(ByValnAsInteger,f()AsInteger)
DimiAsInteger,kAsInteger
i=2
Do
IfnModi=0Then'条件满足是因数
k=k+1
ReDimPreservef(k)
f(k)=i'将其存入数组
n=n\i'将n缩小因数倍
DoWhilenModi=0'去掉相同的因数
n=n\i
Loop
Else
i=i+1
EndIf
LoopUntiln<=1
EndSub
形参说明:
n为需要分解因数的正整数,由于n的值在过程中发生了改变,所以将n声明为传值参数。
f数组用于存放找到的不同的质因数,由于因数个数不确定,因此数组f应为一个动态数组。
调用结束通过数组f返回结果。
2.15生成无重复元素的随机整数序列
分析:
生成无重复随机数的方法是,首先生成第一个随机数作为数组的第一个元素,然后每生成一个随机数就与数组中已有的元素进行比较,若都不相同,则存入数组,若与数组中某一元素相同,则放弃该数,重新生成一个,直至生成全部元素。
Sub过程如下:
PrivateSubrnum(a()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第2部分 常用过程 部分 常用 过程