Office中国论坛/Access中国论坛

标题: [高1]求1*2*3*...*1000的值 [打印本页]

作者: lwwvb    时间: 2005-3-26 05:37
标题: [高1]求1*2*3*...*1000的值
s=1*2*3*4*5*6*...*998*999*1000

s=?

要求精度要达到个位.最短代码者胜.[em05]
作者: goodidea    时间: 2005-3-27 02:14


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
作者: ganrong    时间: 2005-3-28 09:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: goodidea    时间: 2005-3-28 18:30
重发, 一个可以计算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
作者: tmtony    时间: 2005-3-28 18:46
哇, 厉害!!我有些晕了
作者: Trynew    时间: 2005-3-30 06:13
[attach]9650[/attach]

下面的程序效率不是很高,但超大整数乘法、加法的函数还是比较实用

Public Function factorial(num As Integer) As String

    factorial = "1"

    For num = num To 1 Step -1

        factorial = strMult(factorial, Trim(Str(num)))

    Next

End Function

'1000 的阶乘=40238726007709377354370243392300398571937...用时6分钟

'超大整数乘法 (需调用下面的strAdd、strPlus自定义函数)

Public Function strMult(str1 As String, str2 As String) As String

    Dim i As Integer

    If Len(str2) = 1 Then

        strMult = IIf(str2 = "0", "", str1)

        For i = 1 To Val(str2) - 1

            strMult = strAdd(strMult, str1)

        Next

    Else

        strMult = strAdd(strMult(str1, Right(str2, 1)), strMult(str1 & "0", Left(str2, Len(str2) - 1)))

    End If

End Function

'超大整数加法 (需调用下面的strPlus自定义函数)

Public Function strAdd(str1 As String, str2 As String) As String

    If Len(str1) < Len(str2) Then

        strAdd = strAdd(str2, str1)

    Else

        Dim num As Long

        strAdd = strPlus(str1, "", Val(Right(str2, 1)))

        For num = 1 To Len(str2) - 1

            strAdd = strPlus(Left(strAdd, Len(strAdd) - num), Right(strAdd, num), Val(Mid(str2, Len(str2) - num, 1)))

        Next

    End If

End Function

Public Function strPlus(str1 As String, str2 As String, num As Integer) As String

    If Len(str1) = 1 Then

        strPlus = (Val(str1) + num) & str2

    Else

        num = Val(Right(str1, 1)) + num

        If num < 10 Then

            strPlus = Left(str1, Len(str1) - 1) & num & str2

        Else

            strPlus = strPlus(Left(str1, Len(str1) - 1), (num Mod 10) & str2, 1)

        End If

    End If

End Function


作者: test2000    时间: 2005-3-30 07:29
哇,开了眼界
作者: quanli    时间: 2005-4-26 23:47
开了眼界,,对于 这种运算,我比较头痛。。。学习
作者: duzili    时间: 2005-5-6 03:49
我的妈呀!
作者: LucasLynn    时间: 2005-8-3 19:08
楼主这是用VB.NET写的吧

[此贴子已经被作者于2005-8-5 12:59:50编辑过]


作者: LucasLynn    时间: 2005-8-3 19:48
Dim Total(858) As Long

Public Sub Main()

    Total(0) = 2

    For x = 499 To 0 Step -1

        For i = UBound(Total) - 3 To LBound(Total) Step -1

            Total(i) = Total(i) * (250000 - x * x)

            Total(i + 1) = Total(i + 1) + Total(i) \ 1000

            Total(i) = Total(i) Mod 1000

            Total(i + 2) = Total(i + 2) + Total(i + 1) \ 1000

            Total(i + 1) = Total(i + 1) Mod 1000

            Total(i + 3) = Total(i + 3) + Total(i + 2) \ 1000

            Total(i + 2) = Total(i + 2) Mod 1000

        Next i

    Next x

    For i = UBound(Total) - 3 To LBound(Total) + 1 Step -1

        Debug.Print Format(Total(i), "000") & ",";

    Next i

    Debug.Print Format(Total(0), "000")

End Sub

VBA代码,运算时间1秒左右。输出时间2秒左右。

计算结果是:

402,387,260,077,093,773,543,702,433,923,003,985,719,374,864,210,714,632,543,799,910,429,938,512,398,629,020,592,044,208,486,969,404,800,479,988,610,197,196,058,631,666,872,994,808,558,901,323,829,669,944,590,997,424,504,087,073,759,918,823,627,727,188,732,519,779,505,950,995,276,120,874,975,462,497,043,601,418,278,094,646,496,291,056,393,887,437,886,487,337,119,181,045,825,783,647,849,977,012,476,632,889,835,955,735,432,513,185,323,958,463,075,557,409,114,262,417,474,349,347,553,428,646,576,611,667,797,396,668,820,291,207,379,143,853,719,588,249,808,126,867,838,374,559,731,746,136,085,379,534,524,221,586,593,201,928,090,878,297,308,431,392,844,403,281,231,558,611,036,976,801,357,304,216,168,747,609,675,871,348,312,025,478,589,320,767,169,132,448,426,236,131,412,508,780,208,000,261,683,151,027,341,827,977,704,784,635,868,170,164,365,024,153,691,398,281,264,810,213,092,761,244,896,359,928,705,114,964,975,419,909,342,221,566,832,572,080,821,333,186,116,811,553,615,836,546,984,046,708,975,602,900,950,537,616,475,847,728,421,889,679,646,244,945,160,765,353,408,198,901,385,442,487,984,959,953,319,101,723,355,556,602,139,450,399,736,280,750,137,837,615,307,127,761,926,849,034,352,625,200,015,888,535,147,331,611,702,103,968,175,921,510,907,788,019,393,178,114,194,545,257,223,865,541,461,062,892,187,960,223,838,971,476,088,506,276,862,967,146,674,697,562,911,234,082,439,208,160,153,780,889,893,964,518,263,243,671,616,762,179,168,909,779,911,903,754,031,274,622,289,988,005,195,444,414,282,012,187,361,745,992,642,956,581,746,628,302,955,570,299,024,324,153,181,617,210,465,832,036,786,906,117,260,158,783,520,751,516,284,225,540,265,170,483,304,226,143,974,286,933,061,690,897,968,482,590,125,458,327,168,226,458,066,526,769,958,652,682,272,807,075,781,391,858,178,889,652,208,164,348,344,825,993,266,043,367,660,176,999,612,831,860,788,386,150,279,465,955,131,156,552,036,093,988,180,612,138,558,600,301,435,694,527,224,206,344,631,797,460,594,682,573,103,790,084,024,432,438,465,657,245,014,402,821,885,252,470,935,190,620,929,023,136,493,273,497,565,513,958,720,559,654,228,749,774,011,413,346,962,715,422,845,862,377,387,538,230,483,865,688,976,461,927,383,814,900,140,767,310,446,640,259,899,490,222,221,765,904,339,901,886,018,566,526,485,061,799,702,356,193,897,017,860,040,811,889,729,918,311,021,171,229,845,901,641,921,068,884,387,121,855,646,124,960,798,722,908,519,296,819,372,388,642,614,839,657,382,291,123,125,024,186,649,353,143,970,137,428,531,926,649,875,337,218,940,694,281,434,118,520,158,014,123,344,828,015,051,399,694,290,153,483,077,644,569,099,073,152,433,278,288,269,864,602,789,864,321,139,083,506,217,095,002,597,389,863,554,277,196,742,822,248,757,586,765,752,344,220,207,573,630,569,498,825,087,968,928,162,753,848,863,396,909,959,826,280,956,121,450,994,871,701,244,516,461,260,379,029,309,120,889,086,942,028,510,640,182,154,399,457,156,805,941,872,748,998,094,254,742,173,582,401,063,677,404,595,741,785,160,829,230,135,358,081,840,096,996,372,524,230,560,855,903,700,624,271,243,416,909,004,153,690,105,933,983,835,777,939,410,970,027,753,472,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,00
作者: 海狸先生    时间: 2005-8-4 01:29
只能用一句话,高,实在是高
作者: paltt    时间: 2006-3-9 17:53
。。。。
作者: paltt    时间: 2006-3-9 17:59
以下是引用LucasLynn在2005-8-3 11:48:00的发言:




Dim Total(858) As Long
Public Sub Main()
    Total(0) = 2
    For x = 499 To 0 Step -1
        For i = UBound(Total) - 3 To LBound(Total) Step -1
            Total(i) = Total(i) * (250000 - x * x)
            Total(i + 1) = Total(i + 1) + Total(i) \ 1000
            Total(i) = Total(i) Mod 1000
            Total(i + 2) = Total(i + 2) + Total(i + 1) \ 1000
            Total(i + 1) = Total(i + 1) Mod 1000
            Total(i + 3) = Total(i + 3) + Total(i + 2) \ 1000
            Total(i + 2) = Total(i + 2) Mod 1000
        Next i
    Next x
    For i = UBound(Total) - 3 To LBound(Total) + 1 Step -1
        Debug.Print Format(Total(i), "000") & ",";
    Next i
    Debug.Print Format(Total(0), "000")
End Sub



VBA代码,运算时间1秒左右。输出时间2秒左右。

计算结果是:

402,387,260,077,093,773,543,702,433,923,003,985,719,374,864,210,714,632,543,

看不懂,是什麼思路來的。


作者: okmijn    时间: 2006-5-16 05:50
厉害啊
作者: qlm    时间: 2006-5-23 20:41
很晕!
作者: fannky    时间: 2006-5-26 23:27
凶悍!
作者: goodidea    时间: 2009-9-28 21:40
前一阵学习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).
因为这个语言没有循环,尾递归被推荐广泛使用。
递归都应尽可能地转换成尾递归。(不支持尾递归的语言例外)
作者: GOODWIN    时间: 2021-10-10 15:22
凶悍!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3