分享
 
 
 

一道面试题, 求 1000!的位数(VBS实现)

王朝vb·作者佚名  2006-01-27
窄屏简体版  字體: |||超大  

http://community.csdn.net//Expert/TopicView2.asp?id=4498174&datebasetype=now Option Explicit

'VBS 实现求 1000! 位数

'作者: xiaoyuehen(萧月痕)

'日期: 2006-1-6

'MSN: xiaoyuehen(at)msn.com

'大数加法

'参数 x: 加数, y: 被加数

'以数组存储

function GetAddResult(x, y)

Dim arrR(), strX, strY, lx, ly

strX = StrReverse(x)

strY = StrReverse(y)

lx = Len(strX)

ly = Len(strY)

'Msgbox lx

Dim i, iMax, iJinWei

If lx > ly Then

iMax = lx

Else

iMax = ly

End If

ReDim arrR(iMax)

iJinWei = 0

For i = 1 to iMax

arrR(i) = int("0" & Mid(strX, i, 1)) + int("0" & Mid(strY, i, 1)) + iJinWei

iJinWei = arrR(i) \ 10

arrR(i) = Right(arrR(i), 1)

Next

Dim strResult

strResult = StrReverse(Join(arrR, ""))

If Left(strResult, 1) = "0" Or iJinWei = 1 Then

strResult = "1" & strResult

End If

GetAddResult = strResult

End function

'加法

'参数 x: 加数, y: 被加数

'以字符串构造

'该方法经过试验不可行..速度太慢!

function GetAddNResult(x, y)

Dim strX, strY, lx, ly

strX = StrReverse(x)

strY = StrReverse(y)

lx = Len(strX)

ly = Len(strY)

Dim i, iMax, iJinWei

If lx > ly Then

iMax = lx

Else

iMax = ly

End If

Dim iTemp, strResult

iJinWei = 0

iTemp = 0

For i = 1 to iMax

iTemp = int("0" & Mid(strX, i, 1)) + int("0" & Mid(strY, i, 1)) + iJinWei

iJinWei = iTemp \ 10

strResult = (iTemp Mod 10) & strResult

Next

If Left(strResult, 1) = "0" Or iJinWei = 1 Then

strResult = "1" & strResult

End If

GetAddNResult = strResult

End function

'乘法

'参数 x: 大数, y: 小数(一位)

function GetMulResult(x, y)

GetMulResult = 0

Dim i

For i = 1 to y

GetMulResult = GetAddResult(GetMulResult, x)

Next

End function

'乘法

'参数 x: 大数, y: 小数

function GetMultResult(x, y)

GetMultResult = 0

Dim str, lx, ly, i

ly = Len(y)

For i = 1 to ly

GetMultResult = GetAddResult(GetMultResult, GetMulResult(x, CInt(Mid(y, i, 1))) & String(ly - i, "0"))

Next

End function

'乘法

'参数 x: 大数, y: 大数

function GetMulcResult(x, y)

If Len(x) > Len(y) Then

GetMulcResult = GetMultResult(x, y)

Else

GetMulcResult = GetMultResult(y, x)

End If

End function

'阶乘

'参数 x: 自然数

function GetFactorialResult(x)

GetFactorialResult = x

Dim i

For i = (x - 1) to 2 step - 1

GetFactorialResult = GetMulcResult(GetFactorialResult, i)

Next

End function

'直接求阶乘位数

'参数 x: 自然数

'原作: aiur2000(闭关失败,走火入魔,开关拉!)

'vbs代码实现: xiaoyuehen

function GetFactorialLength(x)

Dim iLen, iSum, iVal, i

'思路:因为不计算具体值,所以没必要全部算出,只用计算能影响到结果的位数即可,同时要加入下次影响结果的值.

'做法:每次的积取下次乘数的位数的2倍即可.

'下一个乘数的位数

iLen = 0

'位数

iSum = 0

'积

iVal = 1

For i = 1 to x

iLen = Len(i)

'如果积超过乘数位数2倍,后面的记入汇总位数

If Len(iVal) > iLen * 2 Then

iSum = iSum + (Len(iVal) - iLen * 2)

iVal = Left(iVal, iLen * 2)

End If

iVal = iVal * i

Next

GetFactorialLength = Len(iVal) + iSum

End function

'下面开始各项测试

Dim t, x, y

t = Timer

x = String(1000, "9")

y = String(1000, "9")

'y = String(200, "9")

'Msgbox " String 总用时: " & FormatNumber(Timer - t) & " 秒"

't = Timer

'Call GetAddResult(x, y)

'Msgbox " GetAddResult: " & "GetAddResult(x, y)" & " 总用时: " & FormatNumber(Timer - t) & " 秒"

t = Timer

'Call GetFactorialLength(1000)

Msgbox " GetFactorialLength(1000): " & GetFactorialLength(1000) & " 总用时: " & FormatNumber(Timer - t) & " 秒"

't = Timer

'Call GetMulResult(x, y)

'Msgbox " GetMulResult: " & GetMulResult(x, y) & " 总用时: " & FormatNumber(Timer - t) & " 秒"

't = Timer

'Call GetMulResult(x, y)

'Msgbox " GetMultResult: " & GetMultResult(x, y) & " 总用时: " & FormatNumber(Timer - t) & " 秒"

't = Timer

'Call GetMulResult(x, y)

'Msgbox " GetMulcResult: " & GetMulcResult(x, y) & " 总用时: " & FormatNumber(Timer - t) & " 秒"

't = Timer

'Call GetAddResult(x, y)

'Msgbox " GetAddResult 总用时: " & FormatNumber(Timer - t) & " 秒"

't = Timer

'Call GetAddNResult(x, y)

'Msgbox " GetAddNResult 总用时: " & FormatNumber(Timer - t) & " 秒"

'x = 300

't = Timer

'Call GetFactorialResult(x)

'Msgbox " GetFactorialResult(" & x & ") = " & GetFactorialResult(x) & " 总用时: " & FormatNumber(Timer - t) & " 秒"

'Msgbox " 共 " & Len(GetFactorialResult(x)) & " 位, 用时: " & FormatNumber(Timer - t) & " 秒"

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有