Visual Basic程序设计语言常用算法例题源代码30题Word文档格式.docx
《Visual Basic程序设计语言常用算法例题源代码30题Word文档格式.docx》由会员分享,可在线阅读,更多相关《Visual Basic程序设计语言常用算法例题源代码30题Word文档格式.docx(29页珍藏版)》请在冰豆网上搜索。
3.统计字符串中“O”的个数
a="
THEREISABOOKONTHEDESK"
m=len(a)
Fori=1Tom
b=mid(a,i,1)
Ifb="
O"
Thennum=num+1
Printnum
4.从给定的字符串中只分离出数字
DimsAsString,tAsString
DimiAsInteger
s=Text1.Text
IfMid(s,i,1)>
="
0"
AndMid(s,i,1)<
=9Then
t=t&
Text2.Text=t
5.
(一)将正整数转化成二进制数
DimnAsLong,tAsString
n=Val(Text1.Text)
Do
t=nMod2&
t
n=n\2
LoopUntiln=0
5、
(二)将正整数转化成16进制
DimnAsLong,tAsString,gAsString
g=nMod16
IfVal(g)>
9Then
g=Chr(55+Val(g))
t=g&
n=n\16
5、(三)将正整数转化成8进制
t=nMod8&
n=n\8
6.找出100以内的所有勾股数(不包括100)
DimaAsInteger,bAsInteger,cAsInteger,nAsInteger
Fora=1To99
Forb=1To99
Forc=1To99
Ifa^2+b^2=c^2Anda<
>
bThen
n=n+1
Printa;
b;
c;
“;
IfnMod5=0Then
Nextc
Nextb
Nexta
Printn
7.找出三位数字中的所有升序数(各位数字>
十位数字>
百位数字)
Fora=1To9
Forb=1To9
Forc=1To9
Ifa<
bAndb<
cThen
Printa*100+b*10+c;
IfnMod10=0Then'
控制每行打印10个
或
DimnAsInteger,a1AsInteger,a2AsInteger,a3AsInteger,jsAsInteger
Forn=100To999
a1=n\100‘取出百位数字
a2=n\10Mod10‘取出十位数字
a3=nMod10‘取出个位数字
Ifa1<
a2Anda2<
a3Then
js=js+1
Printn;
IfjsMod10=0Then
Nextn
Printjs
利用过程调用思想求升序数
例找出a-b范围内的所有升序数,a>
=100,b<
=30000
Privatesubcommand1_click()
Dimaasinteger,basinteger,iasinteger
a=text1:
b=text2
Fori=atob
Ifsx(i)then
List1.additemi
Endif
Endsub
Privatesubfunctionsx(byvalnasinteger)asboolean
Dima()asinteger,kasinteger,iasinteger
K=k+1
Redimpreservea(k)
a(k)=nmod10
n=n\10
loopuntiln<
=0
fori=1toubound(a)-1
ifa(i+1)>
=a(i)thenexitfunction(应该去判断a
(1)>
a
(2)……a(k)但是不好判断,遇难则反,只要有一个a(i+1)>
=a(i)这不是升序数)
nexti
sx=true
endfunction
8.最小公倍数
Dimm%,n%,tem%
m=Val(Text1.Text)
n=Val(Text2.Text)
tem=m
DoWhiletemModn<
0
tem=tem+m
Loop
Printm;
和"
n;
的最小公倍数是:
"
tem
9.求一维数组a(n)各元素的和:
Dimsasinteger,Iasintger
s=0
fori=1ton
s=s+a(i)
10.求二维数组a(n,m)各元素的和
Dimsasinteger,iasinteger,jasinteger
Fori=1ton
forj=1tom
s=s+a(i,j)
nextj
Nexti
11.求二维数组a(m,n)周边元素的和
Dimsasinteger,iasinteger
S=0
s=s+a(1,i)+a(m,i)(求第一行与最后一行的和)
fori=2tom-1
s=s+a(i,1)+a(i,n)(求第二行到倒数第二行第一列与最后一列的和)
12、求二维数组a(n,n)主对角线元素的和(理解主对角线)
Dimsasinteger,iasinteger
s=s+a(i,i)
13、求二维数组a(n,n)次对角线元素的
Dimaasinteger,iasinteger
s=s+a(i,n+1-i)
14、三种排序法
(1)选择排序法是逐个比较,逆序交换;
冒泡法是两两比较,逆序交换.
(2)直接排序法(以降序为例)特点:
比较后不立即互换元素,而是记下较大值的位置,并在每一轮比较完毕后和S(i)互换
选择排序法(比较排序法)基本过程(以降序为例):
将第一个元素顺序与其后面的元素比较,比第一个大则进行交换,第一轮完毕后,最大的元素被挪到了第一个位置,第二轮从第二个元素开始重复上面的过程,结束后得到第二个最大的元素,如此下去经过N-1轮的比较,可将N个数排好
(3)冒泡法排序(以升序为例),则方法为:
将相邻两个数比较,把小数对调到前边,如此进行一轮后,就会把最大的数互换到最后,再进行一次,则会把第二大数排在倒数第二的位置上,进行N-1次后,整个数列即可排好.在这种排序过程中,小数如同气泡一样逐层上浮,而大数逐个下沉,因此,被形象的喻为“冒泡”.
选择法对数组经行降序排列
Optionexplicit
Optionbase1
Dimsort(10)asinteger,tempasinteger,iasinteger,jasinteger
Fori=1to10
Sort(i)=int(rnd*99)+1
Text1=text1&
str(sort(i))
Fori=1to9
Forj=i+1to10
Ifsort(i)<
sort(j)then
Temp=a(i)
a(i)=a(j)
a(j)=temp
endif
nextj
text2=text2&
endsub
直接排序法的精髓(降序)
Fori=1toN-1
pointer=I ‘初始化pointer,在每轮比较开始处
forj=I+1toN
ifSort(pointer)<
Sort(j)thenpointer=j
nextj
ifI<
pointerthen
temp=Sort(i)‘交换
Sort(i)=Sort(pointer)
Sort(pointer)=temp
endif
NextI
冒泡排序法的精髓(升序)
forj=1toN-i‘比较次数逐次减少
ifS(j)>
S(j+1)then
t=S(j)
S(j)=S(j+1)
S(j+1)=t‘立即互换
endif
nexti
15、求三个数的和!
PrivateSubifnum(str1AsString,nAsInteger)
DimkAsInteger
Fork=1ToLen(str1)‘逐个字符判断是否为数字
IfAsc(Mid(str1,k,1))<
48OrAsc(Mid(str1,k,1))>
57Then
n=0:
ExitSub
Nextk
n=1
DimaAsString,bAsString,cAsString
Dimy1AsInteger,y2AsInteger,y3AsInteger
a=Text1.Text‘a,b,c用来取得三个文本框的字符串
b=Text2.Text
c=Text3.Text
Callifnum(a,y1)'
用来判断a,b,c是否为数字串,为数字串时y1,y2,y3都为1
Callifnum(b,y2)
Callifnum(c,y3)
Ify1=1Andy2=1Andy3=1Then
Text4.Text=Val(a)+Val(b)+Val(c)
Else
Text4.Text="
三个文本框内有非数字串"
EndIf
16.求三个数的最小公倍数
DimAAsInteger,BAsInteger
DimLAsLong,CAsInteger
A=Text1
B=Text2
C=Text3
L=LCM(LCM(A,B),C)
Text4=L
PrivateFunctionLCM(ByValXAsInteger,ByValYAsInteger)
DimMAsLong,FlgAsBoolean
Flg=False
DoUntilFlg
M=M+X
IfMModY=0Then
Flg=True
Loop
LCM=M
EndFunction
17.打印九九乘法表
Privatesubform_click
DimIasinteger,jasinteger
Fori=1to9
Forj=1toi
Printj;
”*”I;
”=”i*j;
Nextj
print
18判断完数(一个数如果恰好等于他所有因子之和,这个数就是完数。
一个数的因子是指除了该数本身以外能够整除该数的数)
Dimmasinteger,iasinteger,jasinteger,sumasinteger
Dima()
M=text1
Fori=1tom-1
Ifmmodi=0then
Sum=sum+i
J=j+1
Redimpreservea(j)
a(j)=i
ifm=sumthen
picture1.printm&
“是完数,因为”
picture1.printm;
”=”
fori=1toubound(a)-1
picture1.printa(i);
“+”;
nexti
picture1.printa(i)
else
“不是完数”
endif
endsub
19.判断亲密对数(甲数的所有因子之和等于乙数,乙数的所有因子之和等于甲数)---找出5000以内的亲密对数
Dimiasinteger,sum1asinteger,sum2asinteger
Fori=1to5000
Callsum_factors(I,sum1)
Callsumfactors(sum1,sum2)
Ifi=sum2andi<
sum1then
Text1=text1&
I&
“,”&
sum1&
vbcrlf
Privatesubsum_factors(byvalnasinteger,sumasinteger)
DimIasinteger
Sum=0
Fori=1ton-1
Ifnmodi=0then
20.判断孪生素数(a,b都是素数,且|a-b|=2)
例求x到y之间的孪生素数
Dimxasinteger,Iasinteger,yasinteger
x=text1:
y=text2
fori=xtoy-2
ifjudge(i)andjudge(i+2)then
list1.additemI&
““&
i+2
privatefunctionjudge(nasinteger)asBoolean
dimiasinteger
fori=2ton-1
ifnmodi=0thenexitfunction
judge=true
21.求armstrong数(一个n位的正整数其各位的n次方只和等于这个数)
如153=1^3+5^3+3^3
Dimbasinteger,Iasinteger,casinteger,tasinteger,sasdouble
Dimj()asinteger
Fori=10to9999
C=len(cstr(i))
S=0
Forb=1toc
Redimpreservej(b)
j(b)=val(mid(i,b,1))
s=s+j(b)^c
nextb
ifi=sthen
text1=text1&
i&
“=”
fort=1toc-1
text1=text1&
j(b)&
“^”&
c&
“+”
nextt
j(c)&
*补充说明
分解数字的两种方法
<
1>
首先提取的是个位数字
Do
K=k+1
Redimpreservea(k)
a(k)=nmod10
n=n\10
loopuntiln<
2>
首先提取的是最高位数
S=cstr(n)
Fori=1tolen(s)
Redimpreservea(len(s))
a(i)=mid(s,i,1)
22.判断自守数(是指这个数平方运算后尾数等于该数自身的自然数)
Dimxaslong
x=val(text1)
ifzi(x)then
list1.additemx
msgboxstr(x)&
“不是自守数。
”
privatefunctionzi(xaslong)asboolean
dimyasinteger,sasinteger,zasstring
zi=false
y=x*x
s=len(sctr(x))
ifx=val(right(cstr(y),s))then
zi=true
23.求一个n为正整数的反序数(1234---4321)如果一个数的末尾为0,这该数没反序数
Dimnaslong
n=text1
ifright(cstr(n),1)=0then
text2=”尾数为0,没有反序数”
text2=nx(n)
privatefunctionnx(naslong)aslong
dimstasstring,sasinteger,iasinteger
s=len(cstr(n))(统计正整数n的长度)
fori=sto1step-1
st=st&
mid(cstr(n),i,1)
nx=val(st)
dimkasinteger,stasstring
do
k=nmod10
k
nx=val(st)
24.利用通用过程求最值
privatesubcommand1_click()
dimx(10)asinteger,maxvasinteger,minvasinteger,iasinteger
fori=1to10
x(i)=int(90*rnd)+10
str(x(i))
nex