第2部分 常用过程.docx

上传人:b****9 文档编号:26134609 上传时间:2023-06-17 格式:DOCX 页数:34 大小:25.26KB
下载 相关 举报
第2部分 常用过程.docx_第1页
第1页 / 共34页
第2部分 常用过程.docx_第2页
第2页 / 共34页
第2部分 常用过程.docx_第3页
第3页 / 共34页
第2部分 常用过程.docx_第4页
第4页 / 共34页
第2部分 常用过程.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

第2部分 常用过程.docx

《第2部分 常用过程.docx》由会员分享,可在线阅读,更多相关《第2部分 常用过程.docx(34页珍藏版)》请在冰豆网上搜索。

第2部分 常用过程.docx

第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()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿理论经验

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1