设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 9544|回复: 20
打印 上一主题 下一主题

[高1]求1*2*3*...*1000的值

[复制链接]
1#
发表于 2005-3-27 02:14:00 | 显示全部楼层


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

  Dim i As Int16

  Dim j As Int16 = 0

  Dim n As Int16 = 0

  Dim part(300, 1) As Int64

  Dim r As String  Dim maxPart As Int16 = 1

  Dim maxNum As Int64 = 10000000000

  Dim maxWidth As Int16 = 10  '  Dim temp As Int16

  Try

   part(1, 0) = 1

   For i = 1 To CType(Me.TextBox1.Text, Int16)    For j = 1 To maxPart

     part(j, 0) *= i

    Next    For j = 1 To maxPart     If part(j, 0) > maxNum Then

      n = j + 1

      part(n, 0) = part(j, 0) \ maxNum + part(n, 0)

      part(n, 1) = maxWidth + part(j, 1)      part(j, 0) = part(j, 0) Mod maxNum

     End If

    Next

    If maxPart < n Then maxPart += 1

    n = 0

   Next  Catch ex As Exception

   MsgBox(ex.Message & " " & maxPart.ToString & " ")

  Finally

   r = ""

   Me.TextBox2.Text = ""

   For j = 1 To maxPart    r = part(j, 0).ToString

    r = "," & New String("0", 10 - r.Length) & r

    Me.TextBox2.Text = r & Me.TextBox2.Text

   Next

  End Try End Sub计算结果是:40238726,0077093773,5437024339,2300398571,9374864210,7146325437,9991042993,8512398629,0205920442,0848696940,4800479988,6101971960,5863166687,2994808558,9013238296,6994459099,7424504087,0737599188,2362772718,8732519779,5059509952,7612087497,5462497043,6014182780,9464649629,1056393887,4378864873,3711918104,5825783647,8499770124,7663288983,5955735432,5131853239,5846307555,7409114262,4174743493,4755342864,6576611667,7973966688,2029120737,9143853719,5882498081,2686783837,4559731746,1360853795,3452422158,6593201928,0908782973,0843139284,4403281231,5586110369,7680135730,4216168747,6096758713,4831202547,8589320767,1691324484,2623613141,2508780208,0002616831,5102734182,7977704784,6358681701,6436502415,3691398281,2648102130,9276124489,6359928705,1149649754,1990934222,1566832572,0808213331,8611681155,3615836546,9840467089,7560290095,0537616475,8477284218,8967964624,4945160765,3534081989,0138544248,7984959953,3191017233,5555660213,9450399736,2807501378,3761530712,7761926849,0343526252,0001588853,5147331611,7021039681,7592151090,7788019393,1781141945,4525722386,5541461062,8921879602,2383897147,6088506276,8629671466,7469756291,1234082439,2081601537,8088989396,4518263243,6716167621,7916890977,9911903754,0312746222,8998800519,5444414282,0121873617,4599264295,6581746628,3029555702,9902432415,3181617210,4658320367,8690611726,0158783520,7515162842,2554026517,0483304226,1439742869,3306169089,7968482590,1254583271,6822645806,6526769958,6526822728,0707578139,1858178889,6522081643,4834482599,3266043367,6601769996,1283186078,8386150279,4659551311,5655203609,3988180612,1385586003,0143569452,7224206344,6317974605,9468257310,3790084024,4324384656,5724501440,2821885252,4709351906,2092902313,6493273497,5655139587,2055965422,8749774011,4133469627,1542284586,2377387538,2304838656,8897646192,7383814900,1407673104,4664025989,9490222221,7659043399,0188601856,6526485061,7997023561,9389701786,0040811889,7299183110,2117122984,5901641921,0688843871,2185564612,4960798722,9085192968,1937238864,2614839657,3822911231,2502418664,9353143970,1374285319,2664987533,7218940694,2814341185,2015801412,3344828015,0513996942,9015348307,7644569099,0731524332,7828826986,4602789864,3211390835,0621709500,2597389863,5542771967,4282224875,7586765752,3442202075,7363056949,8825087968,9281627538,4886339690,9959826280,9561214509,9487170124,4516461260,3790293091,2088908694,2028510640,1821543994,5715680594,1872748998,0942547421,7358240106,3677404595,7417851608,2923013535,8081840096,9963725242,3056085590,3700624271,2434169090,0415369010,5933983835,7779394109,7002775347,2000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000,0000000000
2#
发表于 2005-3-28 18:30:00 | 显示全部楼层
重发, 一个可以计算922,337,203的阶乘Private Sub NewSub()

  ' 计算大数 阶乘

  Dim i As Int16

  Dim j As Int16 = 0

  Dim partColl As New System.Collections.ArrayList(5)  '这里用动态数组

  Dim r As String  Dim maxPart As Int16 = 0

  Const maxNum As Int64 = 10000000000

  Const maxWidth As Int16 = 10 ' 这两个常数决定了可以计算多大数的阶乘,  = Int64.Maxvalue / maxNum  Try

   partColl.Add(1)

   For i = 1 To CType(Me.TextBox1.Text, Int16)

    For j = 0 To maxPart

     partColl.Item(j) *= i

    Next

    For j = 0 To maxPart

     If partColl(j) > maxNum Then

      If partColl.Count <= j + 1 Then

       partColl.Add(0)

      End If

      partColl.Item(j + 1) += partColl(j) \ maxNum

      partColl.Item(j) = partColl.Item(j) Mod maxNum

     End If

    Next

    maxPart = partColl.Count - 1

   Next

  Catch ex As Exception

   MsgBox(ex.Message & " " & maxPart.ToString & " ")

  Finally

   r = ""

   Me.TextBox2.Text = ""

   For j = 0 To partColl.Count - 1

    r = "," & New String("0", maxWidth - r.Length) & CType(partColl.Item(j), Int64).ToString

    Me.TextBox2.Text = r & Me.TextBox2.Text

   Next

   Me.Button1.Text = Me.TextBox2.Text.Replace(",", "").Length

  End Try

End Sub
3#
发表于 2009-9-28 21:40:10 | 显示全部楼层
前一阵学习erlang, 它写这个真的是精简又高效。以下是代码:
-module(tut1).
-export([fac/1]).
fac(1) ->   1;
fac(N) ->   N * fac(N-1).
总共4行,真正函数部分只有两行,而且根本无需考虑溢出问题。
以下是采用尾递归的版本:
-module(tut1_1).
-export([fac/1]).
fac(N) ->    fac1(N, 1).
fac1(1, S) ->    S;
fac1(N,S) ->    fac1(N - 1, S*N).
因为这个语言没有循环,尾递归被推荐广泛使用。
递归都应尽可能地转换成尾递归。(不支持尾递归的语言例外)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-13 05:36 , Processed in 0.073648 second(s), 26 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表