asp利用数组实现阶乘计算(大数相乘)

计算一个数的阶乘时,绝对会遇到溢出的问题,往往就要用到大数计算,基本原理大抵是利用一个数组来存储数的每一位,例如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

在这里,调用到了一个名为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

如此就完成了大数相乘的操作,下面是显示大数的函数:

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

计算阶乘:

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

奇怪的是,如果利用递归计算阶乘,当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

在本机(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 )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值