资源简介 其他典型算法之数值计算【例1】 现用VB程序实现上述功能,程序界面如下图所示,在文本框Text1和Text2中分别输入被加数和加数,单击求和按钮Command1,在文本框Text3中显示和。实现上述功能的VB程序如下。但加框处代码有错,请改正。Private Sub Command1_Click()Dim t As Stringx=Text1.Texty=Text2.Textz=″ ″If Len(y)t=x:x=y:y=tEnd IfFor i=1 To Len(y)-Len(x)x=x+″0″ '①Next if=0For i=Len(x) To 1 Step-1a=Val(Mid(x,i,1))b=Val(Mid(y,i,1))z=Str((a+b) Mod 10)+z '②f=(a+b)\10NextIf f=1 Then z=Str(f)+zText3.Text=zEnd Sub答案:①x=″0″+x ②z=Str((a+b+f) Mod 10)+z解析:①高精度数相加前,首先在较小数前添加前导0,使之与较大数的数字位数相等。②计算第i位的数字的方法是:取出x、y的第i位数字a、b,把它们和来自低位的进位f相加,除以10所得的余数即为i位上的数字。【例2】.求两个任意位数正整数的差。功能实现的VB自定义函数程序如下。但加框处代码有错,请改正。Private function fx(x as String,y as String)as String '参数x和y表示被减数和减数 Dim t As String, z As String, a As String, b As String Dim i As Integer,f as Integer ,sign as String z = ″ ″ sign = ″ ″ If Len(y) > Len(x) Or (Len(x) = Len(y) Andxt = x: x = y: y = t: sign = ″-″End IfFor i = 1 To Len(x) - Len(y)y = ″0″ + yNext if = 0For i = Len(x) To 1 Step -1a = Val(Mid(x, i, 1)) ' ① b = Val(Mid(y, i, 1)) If a < b Then f = 1 Else f = 0z = Str(a - b) + z ' ②Nextfx= sign + z End function答案: ①a=Val(Mid(x,i,1))-f ②z=Str(a+f*10-b)+z解析: 根据竖式相减的方法,从个位开始逐位相减,得出各位差值。程序中变量f表示是否有向高位借1,z保存差值,sign表示正负符号。if语句功能是把较大数值存入变量x。第一个for语句的功能是在较小数前添加前导0,使之与较大数位数相同。第二个for语句功能是取出两个数的对应位数字a和b,其中被减数a须先减去借位(0或1),再确定本次减法是否要借位,最后两位数字相减值加入字符串z中。所以①处应填入a = Val(Mid(x, i, 1))-f,②处应填入z = Str(a+f*10-b)+z。【例3】.用VB程序实现大数据加法功能,在文本框Text1和Text2中分别输入位数不超过100的被加数和加数,单击求和按钮Command1,在文本框Text3中显示和。实现上述功能的VB程序如下,请在划线处填入合适代码。Private Sub Command1_Click()Dim a(100) as Integer,b(100) as Integer,c(100) as IntegerDim s1 as String,s2 as String,s3 as StringDim n1 as integer,n2 as Integer,n3 as Integer,cf as Integer'第1个数s1按位分解到数组as1=Text1.Textn1=len(s1)For i=1 to n1a(i)=val(mid(s1,n1-i+1,1))Next i'第2个数s2按位分解到数组bs2=Text2.Textn2=len(s2)For i=1 to 2b(i)=val(mid(s2,n2-i+1,1))Next iIf n1>n2 then n3=n1+1 else n3=n2+1cf=0For i=1 to n3 '按位依次相加 ① cf=c(i)\10 ② Next is3=″ ″If c(n3)=0 then n3=n3-1For i=n3 to 1 step-1 '计算结果输出s3= ③ Next IText3.text=s3End sub答案: ①c(i)=a(i)+b(i)+cf ②c(i)=c(i) mod 10或c(i)=c(i)-cf*10 ③s3+Str(c(i))解析: 数组a和b存放两个加数,个位存放在第一个元素中,十位存入第二个元素,依次存放。变量cf存放进位。①处所在循环执行按位相加过程,每次取出2位数字a(i)和b(i),与来低位的进位cf相加,得到i位数字及进位,所以①处填c(i)=a(i)+b(i)+cf,由①处得到进位值cf=c(i)\10,②处得到i位数字c(i)=c(i) mod 10。③处把每一位数字c(i)连起来,得到结果,i是从n3开始的,即从最高位开始,所以③处填s3+Str(c(i))。如果改为for i=1 to n3,则③处应为Str(c(i))+s3。课后练习1.在VB算术运算中,最大的Double类型有效数字也只有15位。为了实现除法运算的商可以保留任意位数,小明根据除法原理,编写了如下程序。功能如下:程序运行时,在文本框Text1中输入被除数(正整数),在文本框Text2中输入除数(正整数),在文本框Text3中输入小数位数(正整数)。单击按钮Command1后,在标签上Label2显示除法运算的商。程序运行界面如下图所示:请在划线处填入合适代码。 Private Sub Command1_Click()Dim x As Integer,y As IntegerDim n As Integer '用于存储小数位数Dim s As String '用于存储商x=Val(Text1.Text):y=Val(Text2.Text)n=Val(Text3.Text)s=s+Str(x\y)s=s+″.″ '添加小数点k= ① i=1Do While i<=nk=k 10s= ② k=k Mod y ③ LoopLabel2.Caption=″商为:″+sEnd Sub答案 ①x Mod y ②s+Str(k\y) ③i=i+1解析 程序采用迭代算法,具体方法是:先得到商的整数部分,之后通过循环,每次对余数k乘以10,让k\y的值存入s,再让k=k mod y,循环执行,直到i>n或k=0。2.小名编写了一个多位数乘法的VB程序。文本框Text1中输入一个小于等于1000位的乘数,文本框Text2中输入1位乘数,点击“开始计算”按钮Command1后,在文本框Text3中显示计算结果。实现上述功能的VB程序如下,但加框处代码有错,请改正。Private Sub Command1_Click()Dim d(1 To 1001) As Integer,str1 As String,str2 As StringDim i As Integer,n As Integer,k As Integer,s As Integerstr1=Text1.Textn=Len(str1)For i=1 To nd(i)=Val(Mid(str1,i,1))Next is=0 's表示进位k=Val(Text2.Text)For i=n To 1 Step-1d(i)=d(i) k '①s=d(i)\10d(i)=d(i) Mod 10Next iIf s<>0 Then str2=CStr(s) Else str2=″ ″ 'CStr函数功能类似于StrFor i=1 To nstr2=CStr(d(i))+str2 '②Next iText3.Text=str2End Sub答案 ①d(i)=d(i)*k+s ②str2=str2+CStr(d(i))解析 数组d存放被乘数,d(1)存放最高位,d(n)存放最低位。①处所在循环实施乘法,先是让第i位数字d(i)乘以k,并加上来自低位的进位s,结果再存入d(i),d(i)\10的值s即为下一位的进位,更新d(i)=d(i) Mod 10,使d(i)的值是第i位的数字。②处所在循环是要把每一位数字d(i)存入str2,因为d(1)存放最高位,d(n)存放最低位,所以str2=str2+CStr(d(i))。3.求两个任意位数正整数的积。实现该功能的VB程序界面如下所示:在文本框Text1中输入数1,在文本框Text2中输入数2,单击按钮乘积Command3,在文本框Text3中显示乘积。Command3按钮的单击事件处理过程如下。但加框处代码有错,请改正。Private Sub Command3_Click()Dim zero As String, x1 As Integer, y1 As IntegerDim i As Integer, j As IntegerDim s(1 To 100) As String, r As Stringzero = ″ ″x = Text1.Texty = Text2.TextFor i = Len(y) To 1 Step -1f = 0: s(i) = ″ ″: y1 = Val(Mid(y, i, 1))For j = Len(x) To 1 Step -1x1 = Val(Mid(x, j, 1))z = x1 * y1s(i) =s(i)& ((f + z) Mod 10) '①f = z \ 10 '②NextIf f <> 0 Thens(i) = f & s(i) & zeroElses(i) = s(i) & zeroend ifzero = zero + ″0″Nextr = ″ ″For i = 1 To Len(y)r = add(r, s(i)) 'add是自定义函数,功能是把两个数相加Next iText3.Text = rEnd Sub答案: ①((f + z) Mod 10) & s(i) ②(f + z) \ 10解析: 该程序是高精度数运算的一种,其算法思想也是采用竖式相加的方法,如下图:运算过程是:先取出Y中的数字B1,让B1和X各位相乘得乘积s(1)= C 4 C3 C2 C1;取出Y中的数字B2,让B2和X各位相乘得乘积s(2)= D 4 D3 D2 D1;依次类推。程序中,变量f记录向高位的进位数字,zero记录s(i)后需添加的0的个数,如D 4 D3 D2 D1后应加1个0,E4 E3 E2 E1后应添加2个0。①处是把乘积存入s(i)中,应填((f + z) Mod 10) & s(i),②处计算瞬时进位数字,通过上次的进位值加上本次的乘积,再把和整除10得出本位数字,应填(f+z)\10。4.小明编写了一个求真分数精确值的VB程序。程序运行时,在文本框Text1中输入被除数,在文本框Text2中输入除数,并保证被除数小于除数,单击“计算”按钮Command1,在标签Label3中显示结果(最多计算到第20位)。程序运行界面如图所示。(1)实现上述功能的VB程序如下,请在划线处填入合适的代码。Dim a(1 To 20) As Integer, b(1 To 20) As IntegerFunction Judge(position As Integer) As Boolean '判断循环节Dim i As IntegerFor i=1 To position-1If b(i)= ① Then Judge=False:Exit Function Next iJudge=TrueEnd FunctionPrivate Sub Command1_Click()Dim m As Integer,n As Integer,x As Integer,i As IntegerDim flag As Boolean,st As Stringm=Val(Text1.Text):n=Val(Text2.Text)st=Str(m)+″/″+Str(n)+″=0.″i=1:x=1:flag=Trueb(1)=mm=m 10Do While i<=20 And flag=Truea(i)= ② If a(i)>0 Thenx=x+1b(x)=m Mod nm=b(x) 10Elsem=m 10End Ifflag=Judge(x)If b(x)=0 And x<>0 Then flag=Falsest= ③ i=i+1LoopLabel3.Caption=stEnd Sub(2)运行程序,在文本框Text1中输入被除数1,在文本框Text2中输入除数3,单击“计算”按钮Command1,在标签Label3中显示结果是 。 答案 (1)①b(position) ②m\n ③st+Str(a(i))(2)1/3=0.3解析 程序中,数组a存放商的每一位数字,数组b存放每次的余数,变量x存放余数的个数。循环中,先计算商a(i)=m\n,并把商存入st,所以②处m\n,③处填st+Str(a(i))。如果商a(i)>0,则把m/n的余数存入b(x),否则,说明m除不够,须把m乘以10,为下一次m/n准备。接下来利用judge函数判断当前余数b(x)是否有出现过,若有,表明将出现循环小数,无须再除。如果当前余数b(x)=0,说明已经被除尽,也无需再除。自定义函数judge判断第x个余数是否出现过。程序中通过循环检索b(1)~b(position-1)中有否出现过b(position),若有,返回false,否则为true,所以①处填b(position)。5.【难度题】大数据乘法运算就是运用数组,用程序模拟列竖式计算的过程。两个正整数进行乘法计算的一般算法如下:(1)将第一个整数各位上的数字按照从低位到高位的顺序依次存入数组a(1)、a(2)、……、a(La)中,将另一个整数各位上的数字按照从低位到高位的顺序依次存入数组b(1)、b(2)、……、b(Lb)中。其中,La表示第一个整数的位数,Lb表示第二个整数的位数;(2)按照从低位到高位的顺序,将两个整数各位数值进行逐位乘法计算(第一轮先让b(1)依次乘以a(1)、a(2)……a(La),第二轮再让b(2)依次乘以a(1)、a(2)、……a(La),依次进行),每位的乘法结果也按照低位到高位的顺序依次存入数组c(1)、c(2)、c(3)……中;(3)对数组ans中的计算结果进行从低位到高位的进位处理;(4)统计数组ans中实际计算结果的有效数值位数,并将位数值存入变量length;(5)按照高位到低位的顺序输出数组ans中的计算结果。小强按照上述方法设计了一个两数进行大数据乘法计算的VB程序,功能如下:在文本框Text1和Text2中依次输入两个整数,单击“计算”按钮Command1,程序进行大数据乘法计算,并在标签Label4中输出计算结果。下面信息显示了进行高精度乘法计算的主要过程(假设输入的两个整数分别为“123”和“45”)b(1)依次乘数组a中各个数,先不进位 b(2)依次乘数组a中各个数,并在之前结果上累加,先不进位处理进位(逢十进一):数组 ans(4) ans(3) ans(2) ans(1)计算结果 4 13 22 15进位处理后结果 5 5 3 5实现上述功能的VB程序如下:(1)请在划线处填入合适代码。Dim a(1 To 30) As Integer,b(1 To 30) As Integer,c(1 To 60) As IntegerDim La As Integer,Lb As Integer,length As IntegerPrivate Sub Command1_Click()Dim i As Integer,j As Integer,t As Integer,temp As String'将两个乘数(正整数)各数位上的数字按照上述算法依次存入数组a和b,每个正整数位数分别保存到变量La和Lb;将保存结果的数组c(i)值初始化为零(该部分程序代码略)For i=1 To Lb '按低位到高位的顺序进行列竖式的逐位乘法For j=1 To Lac(i+j-1)= ① +b(i)*a(j) Next jNext iFor i=1 To La+Lb '对计算结果进行进位处理c(i+1)=c(i+1)+c(i)\10c(i)= ② Next ilength=La+Lb '最多位数Do While c(length)=0 '计算实际位数length=length-1LoopFor i= ③ To 1 Step-1 Label4.Caption=Label4.Caption+Str(c(i))Next iEnd Sub(2)根据本题算法,若输入的两个整数分别为5125和18,则在输出乘法计算结果时,变量length的值为 。 答案 (1)①c(i+j-1) ②c(i) Mod 10 ③length (2)5解析 ①处循环功能是,让b(i)依次乘数组a中各个数,乘积加上之前结果c(i+j-1)存入c(i+j-1)。②处循环对计算结果进行进位处理,先把第i位的进位c(i)\10加入c(i+1),再计算第i位上的数字,应该是c(i) Mod 10。最后把结果输出,通过循环把每一位c(i)输出,总位数是length,个位存放在c(1),所以③处填length。其他典型算法之数值计算【例1】 现用VB程序实现上述功能,程序界面如下图所示,在文本框Text1和Text2中分别输入被加数和加数,单击求和按钮Command1,在文本框Text3中显示和。实现上述功能的VB程序如下。但加框处代码有错,请改正。Private Sub Command1_Click()Dim t As Stringx=Text1.Texty=Text2.Textz=″ ″If Len(y)t=x:x=y:y=tEnd IfFor i=1 To Len(y)-Len(x)x=x+″0″ '①Next if=0For i=Len(x) To 1 Step-1a=Val(Mid(x,i,1))b=Val(Mid(y,i,1))z=Str((a+b) Mod 10)+z '②f=(a+b)\10NextIf f=1 Then z=Str(f)+zText3.Text=zEnd Sub【例2】.求两个任意位数正整数的差。功能实现的VB自定义函数程序如下。但加框处代码有错,请改正。Private function fx(x as String,y as String)as String '参数x和y表示被减数和减数 Dim t As String, z As String, a As String, b As String Dim i As Integer,f as Integer ,sign as String z = ″ ″ sign = ″ ″ If Len(y) > Len(x) Or (Len(x) = Len(y) Andxt = x: x = y: y = t: sign = ″-″End IfFor i = 1 To Len(x) - Len(y)y = ″0″ + yNext if = 0For i = Len(x) To 1 Step -1a = Val(Mid(x, i, 1)) ' ① b = Val(Mid(y, i, 1)) If a < b Then f = 1 Else f = 0z = Str(a - b) + z ' ②Nextfx= sign + z End function【例3】.用VB程序实现大数据加法功能,在文本框Text1和Text2中分别输入位数不超过100的被加数和加数,单击求和按钮Command1,在文本框Text3中显示和。实现上述功能的VB程序如下,请在划线处填入合适代码。Private Sub Command1_Click()Dim a(100) as Integer,b(100) as Integer,c(100) as IntegerDim s1 as String,s2 as String,s3 as StringDim n1 as integer,n2 as Integer,n3 as Integer,cf as Integer'第1个数s1按位分解到数组as1=Text1.Textn1=len(s1)For i=1 to n1a(i)=val(mid(s1,n1-i+1,1))Next i'第2个数s2按位分解到数组bs2=Text2.Textn2=len(s2)For i=1 to 2b(i)=val(mid(s2,n2-i+1,1))Next iIf n1>n2 then n3=n1+1 else n3=n2+1cf=0For i=1 to n3 '按位依次相加 ① cf=c(i)\10 ② Next is3=″ ″If c(n3)=0 then n3=n3-1For i=n3 to 1 step-1 '计算结果输出s3= ③ Next IText3.text=s3End sub课后练习1.在VB算术运算中,最大的Double类型有效数字也只有15位。为了实现除法运算的商可以保留任意位数,小明根据除法原理,编写了如下程序。功能如下:程序运行时,在文本框Text1中输入被除数(正整数),在文本框Text2中输入除数(正整数),在文本框Text3中输入小数位数(正整数)。单击按钮Command1后,在标签上Label2显示除法运算的商。程序运行界面如下图所示:请在划线处填入合适代码。 Private Sub Command1_Click()Dim x As Integer,y As IntegerDim n As Integer '用于存储小数位数Dim s As String '用于存储商x=Val(Text1.Text):y=Val(Text2.Text)n=Val(Text3.Text)s=s+Str(x\y)s=s+″.″ '添加小数点k= ① i=1Do While i<=nk=k 10s= ② k=k Mod y ③ LoopLabel2.Caption=″商为:″+sEnd Sub2.小名编写了一个多位数乘法的VB程序。文本框Text1中输入一个小于等于1000位的乘数,文本框Text2中输入1位乘数,点击“开始计算”按钮Command1后,在文本框Text3中显示计算结果。实现上述功能的VB程序如下,但加框处代码有错,请改正。Private Sub Command1_Click()Dim d(1 To 1001) As Integer,str1 As String,str2 As StringDim i As Integer,n As Integer,k As Integer,s As Integerstr1=Text1.Textn=Len(str1)For i=1 To nd(i)=Val(Mid(str1,i,1))Next is=0 's表示进位k=Val(Text2.Text)For i=n To 1 Step-1d(i)=d(i) k '①s=d(i)\10d(i)=d(i) Mod 10Next iIf s<>0 Then str2=CStr(s) Else str2=″ ″ 'CStr函数功能类似于StrFor i=1 To nstr2=CStr(d(i))+str2 '②Next iText3.Text=str2End Sub3.求两个任意位数正整数的积。实现该功能的VB程序界面如下所示:在文本框Text1中输入数1,在文本框Text2中输入数2,单击按钮乘积Command3,在文本框Text3中显示乘积。Command3按钮的单击事件处理过程如下。但加框处代码有错,请改正。Private Sub Command3_Click()Dim zero As String, x1 As Integer, y1 As IntegerDim i As Integer, j As IntegerDim s(1 To 100) As String, r As Stringzero = ″ ″x = Text1.Texty = Text2.TextFor i = Len(y) To 1 Step -1f = 0: s(i) = ″ ″: y1 = Val(Mid(y, i, 1))For j = Len(x) To 1 Step -1x1 = Val(Mid(x, j, 1))z = x1 * y1s(i) =s(i)& ((f + z) Mod 10) '①f = z \ 10 '②NextIf f <> 0 Thens(i) = f & s(i) & zeroElses(i) = s(i) & zeroend ifzero = zero + ″0″Nextr = ″ ″For i = 1 To Len(y)r = add(r, s(i)) 'add是自定义函数,功能是把两个数相加Next iText3.Text = rEnd Sub答案: ①((f + z) Mod 10) & s(i) ②(f + z) \ 104.小明编写了一个求真分数精确值的VB程序。程序运行时,在文本框Text1中输入被除数,在文本框Text2中输入除数,并保证被除数小于除数,单击“计算”按钮Command1,在标签Label3中显示结果(最多计算到第20位)。程序运行界面如图所示。(1)实现上述功能的VB程序如下,请在划线处填入合适的代码。Dim a(1 To 20) As Integer, b(1 To 20) As IntegerFunction Judge(position As Integer) As Boolean '判断循环节Dim i As IntegerFor i=1 To position-1If b(i)= ① Then Judge=False:Exit Function Next iJudge=TrueEnd FunctionPrivate Sub Command1_Click()Dim m As Integer,n As Integer,x As Integer,i As IntegerDim flag As Boolean,st As Stringm=Val(Text1.Text):n=Val(Text2.Text)st=Str(m)+″/″+Str(n)+″=0.″i=1:x=1:flag=Trueb(1)=mm=m 10Do While i<=20 And flag=Truea(i)= ② If a(i)>0 Thenx=x+1b(x)=m Mod nm=b(x) 10Elsem=m 10End Ifflag=Judge(x)If b(x)=0 And x<>0 Then flag=Falsest= ③ i=i+1LoopLabel3.Caption=stEnd Sub(2)运行程序,在文本框Text1中输入被除数1,在文本框Text2中输入除数3,单击“计算”按钮Command1,在标签Label3中显示结果是 。 5.【难度题】大数据乘法运算就是运用数组,用程序模拟列竖式计算的过程。两个正整数进行乘法计算的一般算法如下:(1)将第一个整数各位上的数字按照从低位到高位的顺序依次存入数组a(1)、a(2)、……、a(La)中,将另一个整数各位上的数字按照从低位到高位的顺序依次存入数组b(1)、b(2)、……、b(Lb)中。其中,La表示第一个整数的位数,Lb表示第二个整数的位数;(2)按照从低位到高位的顺序,将两个整数各位数值进行逐位乘法计算(第一轮先让b(1)依次乘以a(1)、a(2)……a(La),第二轮再让b(2)依次乘以a(1)、a(2)、……a(La),依次进行),每位的乘法结果也按照低位到高位的顺序依次存入数组c(1)、c(2)、c(3)……中;(3)对数组ans中的计算结果进行从低位到高位的进位处理;(4)统计数组ans中实际计算结果的有效数值位数,并将位数值存入变量length;(5)按照高位到低位的顺序输出数组ans中的计算结果。小强按照上述方法设计了一个两数进行大数据乘法计算的VB程序,功能如下:在文本框Text1和Text2中依次输入两个整数,单击“计算”按钮Command1,程序进行大数据乘法计算,并在标签Label4中输出计算结果。下面信息显示了进行高精度乘法计算的主要过程(假设输入的两个整数分别为“123”和“45”)b(1)依次乘数组a中各个数,先不进位 b(2)依次乘数组a中各个数,并在之前结果上累加,先不进位处理进位(逢十进一):数组 ans(4) ans(3) ans(2) ans(1)计算结果 4 13 22 15进位处理后结果 5 5 3 5实现上述功能的VB程序如下:(1)请在划线处填入合适代码。Dim a(1 To 30) As Integer,b(1 To 30) As Integer,c(1 To 60) As IntegerDim La As Integer,Lb As Integer,length As IntegerPrivate Sub Command1_Click()Dim i As Integer,j As Integer,t As Integer,temp As String'将两个乘数(正整数)各数位上的数字按照上述算法依次存入数组a和b,每个正整数位数分别保存到变量La和Lb;将保存结果的数组c(i)值初始化为零(该部分程序代码略)For i=1 To Lb '按低位到高位的顺序进行列竖式的逐位乘法For j=1 To Lac(i+j-1)= ① +b(i)*a(j) Next jNext iFor i=1 To La+Lb '对计算结果进行进位处理c(i+1)=c(i+1)+c(i)\10c(i)= ② Next ilength=La+Lb '最多位数Do While c(length)=0 '计算实际位数length=length-1LoopFor i= ③ To 1 Step-1 Label4.Caption=Label4.Caption+Str(c(i))Next iEnd Sub(2)根据本题算法,若输入的两个整数分别为5125和18,则在输出乘法计算结果时,变量length的值为 。 展开更多...... 收起↑ 资源列表 其他典型算法之数值计算-专项训练浙江2022届选考专用(学生版).docx 其他典型算法之数值计算-专项训练浙江2022届选考专用(教师版).docx