计算一个数的阶乘时,绝对会遇到溢出的问题,往往就要用到大数计算,基本原理大抵是利用一个数组来存储数的每一位,例如123456转换为数组存储就是a(5)=6、 a(4)=5、a(3)=4、a(2)=3、a(1)=2、a(0)=1
首先我们需要的是一个大数相乘的函数,代码如下:
function
BigChen(val1,val)
dim i,leng1
leng1 = ubound (val1)
for i = 0 to leng1
val1(i) = val1(i) * val
next
call formatBig(val1) ' 在这里对大数数组进行格式化
BigChen = val1
end function
dim i,leng1
leng1 = ubound (val1)
for i = 0 to leng1
val1(i) = val1(i) * val
next
call formatBig(val1) ' 在这里对大数数组进行格式化
BigChen = val1
end function
在这里,调用到了一个名为formatBig的函数,原因是相乘时,往往会遇到有进位的情况,一贯的做法是统一对数组进行格式化,代码如下:
function
FormatBig(result)
dim leng,i
leng = ubound (result)
for i = 0 to leng - 1 ' 从右至左操作第一位至倒数第二位数
if result(i) >= 10 then ' 如果要进位
result(i + 1 ) = result(i + 1 ) + int (result(i) / 10 )
result(i) = result(i) mod 10
end if
next
do while result(leng) >= 10 ' 如果最左一位要进位,对最左一位进行格式化
redim preserve result(leng + 1 ) ' 增加数组长度
result(leng + 1 ) = int (result(leng) / 10 ) ' 进位
result(leng) = result(leng) mod 10
leng = leng + 1 ' 操作位向左移一位
loop
Formatbig = result
end function
dim leng,i
leng = ubound (result)
for i = 0 to leng - 1 ' 从右至左操作第一位至倒数第二位数
if result(i) >= 10 then ' 如果要进位
result(i + 1 ) = result(i + 1 ) + int (result(i) / 10 )
result(i) = result(i) mod 10
end if
next
do while result(leng) >= 10 ' 如果最左一位要进位,对最左一位进行格式化
redim preserve result(leng + 1 ) ' 增加数组长度
result(leng + 1 ) = int (result(leng) / 10 ) ' 进位
result(leng) = result(leng) mod 10
leng = leng + 1 ' 操作位向左移一位
loop
Formatbig = result
end function
如此就完成了大数相乘的操作,下面是显示大数的函数:
sub
OutPutBig(vals)
dim i
response.write " <div style='width:800px;' align=left> "
for i = ubound (vals) to 0 step - 1
response.write vals(i)
next
response.write " </div> "
end sub
dim i
response.write " <div style='width:800px;' align=left> "
for i = ubound (vals) to 0 step - 1
response.write vals(i)
next
response.write " </div> "
end sub
计算阶乘:
function
fac(n)
dim temp
redim temp( 0 )
dim t
dim i
temp( 0 ) = 1
for i = 1 to n
t = bigchen(temp,i)
next
fac = t
end function
dim temp
redim temp( 0 )
dim t
dim i
temp( 0 ) = 1
for i = 1 to n
t = bigchen(temp,i)
next
fac = t
end function
奇怪的是,如果利用递归计算阶乘,当N>=222时,就会造成溢出,不知道为什么,希望高手告知
function
fac2(n)
dim temp( 0 )
temp( 0 ) = 1
if n = 1 then
fac2 = temp
else
fac2 = bigchen(aa(n - 1 ),n)
end if
end function
dim temp( 0 )
temp( 0 ) = 1
if n = 1 then
fac2 = temp
else
fac2 = bigchen(aa(n - 1 ),n)
end if
end function
在本机(C2.4 512M XP pro, IIS5.1)下计算1500!,耗时19671.9毫秒
tim1
=
timer
call outputbig(fac( 1500 ))
tim2 = timer
response.write cstr ( int (( (tim2 - tim1) * 10000 ) + 0.5 ) / 10 )
call outputbig(fac( 1500 ))
tim2 = timer
response.write cstr ( int (( (tim2 - tim1) * 10000 ) + 0.5 ) / 10 )