大數階乘的計算(一)

2021-08-21 22:47:59 字數 1737 閱讀 7619

整數n的階乘指 1*2*3*...*(n-1)*n 的值,在n=171時,計算機一般會出錯(「溢位」),本文採用字串模擬數字乘法運算,使計算10000!成為可能:

function multi(byval x as string, byval y as string) as string 'multi of two huge hexnum(兩個大數之積)

dim result as variant

dim xl as long, yl as long, temp as long, i as long

xl = len(trim(x))

yl = len(trim(y))

redim result(1 to xl + yl)

for i = 1 to xl

for temp = 1 to yl

result(i + temp) = result(i + temp) + val(mid(x, i, 1)) * val(mid(y, temp, 1))

next

next

for i = xl + yl to 2 step -1

temp = result(i) \ 10

result(i) = result(i) mod 10

result(i - 1) = result(i - 1) + temp

next

if result(1) = "0" then result(1) = ""

multi = join(result, "")

erase result

end function

private sub command1_click() '節約時間,算到1000!

for i = 1 to 9

calcfactorial i * 100

next

end sub

sub calcfactorial(byval n as integer)

dim a() as string, i as long, stimer as double

redim a(1 to n)

a(1) = 1

stimer = timer

for i = 2 to n

a(i) = multi(a(i - 1), i)

next

debug.print n & "! : 用時 "; timer - stimer & " 秒, 結果 " & len(a(n)) & " 位"

debug.print a(n)

end sub

100! : 用時 4.67617187496217e-02 秒, 結果 158 位

200! : 用時 .407124999999724 秒, 結果 375 位

300! : 用時 1.00012499999957 秒, 結果 615 位

400! : 用時 1.92199999999957 秒, 結果 869 位

500! : 用時 3.14013671875 秒, 結果 1135 位

600! : 用時 4.68677343750005 秒, 結果 1409 位

700! : 用時 6.64099999999962 秒, 結果 1690 位

800! : 用時 8.9208984375 秒, 結果 1977 位

900! : 用時 11.5000117187501 秒, 結果 2270 位

1000! : 用時 14.5621367187496 秒, 結果 2568 位

計算大數的階乘

問題 計算整數n的階乘,要求計算的結果最長可以到50位!50位十進位制而不是二進位制 先上 然後分析 解析 主要是通過陣列的思想來做。因為階乘太大,一般的資料型別是放不下的!所以可以用陣列來做,陣列每個元素都在0 9之間,陣列的乙個元素表示一位!比如 data 9 2 data 8 3 data 7...

階乘計算 大數計算

輸入乙個正整數n,輸出n 的值。其中n 123 n。演算法描述 n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類推。將a乘以乙個整數k變為將陣列a的每乙個元素都乘以k,請注意處理相應的進製。首先...

精度計算 大數階乘

本演算法的目的在於計算乙個比較大的數的階乘,由於得到的結果比較大,是現有的資料型別無法儲存的,所以我決定將結果儲存在乙個long a陣列中。我們的思路是把每4位數看做陣列的乙個元素來儲存,例如 個 十 百 千存在a 0 萬 十萬 百萬 千萬存在a 1 以此類推。我們用10的階乘來模擬一下求結果大於4...