fxy_2002(阿勇) 升猩猩是很久以前的事儿了! 我这个阿勇就不行了! ------------- 楼主,我写个最简单的字符串加法运算 Private Sub Form_Load() '一个简的大数加法,没有详细考虑,可能不周全 Dim str1 As String, str2 As String, strResult As String Dim tmp1 As Integer, tmp2 As Integer, flag As Integer, l As Long Dim i As Long str1 = "11123345643653464564364368" str2 = "17867888888888889" l = IIf(Len(str1) > Len(str2), Len(str2), Len(str1)) i = l Do While i > 0 tmp1 = Val(Mid(Right(str1, l), i, 1)) tmp2 = Val(Mid(Right(str2, l), i, 1)) strResult = CStr((tmp1 + tmp2 + flag) Mod 10) & strResult i = i - 1 If tmp1 + tmp2 + flag > 9 Then flag = 1 Else flag = 0 Loop If l < Len(str1) Then strResult = Mid(str1, 1, Len(str1) - l) & strResult If l < Len(str2) Then strResult = Mid(str2, 1, Len(str2) - l) & strResult Debug.Print strResult End Sub
我查阅了MSDN,在vb6.0中,最大范围的数据类型就是Variant(字符)莫过于0到20亿的的范围(跟变长string一样)~!现在的数字运算超过20亿的时候简直就是多如繁星!再说这根本不是钻牛角尖的问题!如果没有深入的探究,哪有现在科技?苹果就是会掉下来,为什么就只有有牛顿发现万有引力?如果有好的方法请具体提出,我会非常感谢!!!不要在那里卖关子!没贡献的就不要在这里大言不惭~!
v = CDec(&H7FFFFFFF) * CDec(&H7FFFFFFF)
debug.print v
data[i]=0;
}在每一个数组元素中保存大整型数的一位,这里就可以保存一个40位长度的整型数运算的时候从数组的第一个元素开始计算,小于10则储存在数组这一位中,大于10则需要进位了进位的运算规则为:当前元素保留 当前值 %10
当前元素+1保留 原本已有的值+当前值 /10比如说有4 3 2 1
0 0 0 0这样一个数组
保存了 1119 这个数当前数据结构为:4 3 2 1
1 1 1 9现在需要给这个数加上5则 最低位为 9+5 =14则当前数据结构为:4 3 2 1
1 1 1 14第一位已经超过了10,所以需要进位
则按照上面的规则第一位=当前值 % 10
14%10=4
第二位=原本已有的值+当前值 / 10
1+14/10=2所以数据结构调整为4 3 2 1
1 1 2 4这样就可以保存很长的(只要你内存足够大)的整型数了.
浮点型的可声明为 double a;这两种都是64位字长
BigMath 1.1 (updated July 8, 2007)
http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=68710&lngWId=1
Boolean 2 个字节 True 或 False
Integer 2 个字节 -32,768 到 32,767
Long
(长整型) 4 个字节 -2,147,483,648 到 2,147,483,647
Single
(单精度浮点型) 4 个字节 负数时从 -3.402823E38 到 -1.401298E-45;正数时从 1.401298E-45 到 3.402823E38
Double
(双精度浮点型) 8 个字节 负数时从 -1.79769313486232E308 到
-4.94065645841247E-324;正数时从4.94065645841247E-324 到 1.79769313486232E308
Currency
(变比整型) 8 个字节 从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807
Decimal 14 个字节 没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335,而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335;最小的非零值为 +/-0.0000000000000000000000000001
Date 8 个字节 100 年 1 月 1 日 到 9999 年 12 月 31 日
Object 4 个字节 任何 Object 引用
String
(变长) 10 字节加字符串长度 0 到大约 20 亿
String
(定长) 字符串长度 1 到大约 65,400
Variant
(数字) 16 个字节 任何数字值,最大可达 Double 的范围
Variant
(字符) 22 个字节加字符串长度 与变长 String 有相同的范围
用户自定义
(利用 Type) 所有元素所需数目 每个元素的范围与它本身的数据类型的范围相同。
4楼的哥哥~上面的资料是从MSDN中的,我怎样找也找不到2GB大的数据类型~请问你从那里看到的~???多谢各位的帮助不过问题还是没有解决~上面提出用数组的方法我想过~不过我要将这个数现实出来,就要把他们加起来~一加起来~还不是一样溢出?
BigMath 1.1 (updated July 8, 2007)
http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=68710&lngWId=1
(变长) 10 字节加字符串长度 0 到大约 20 亿
Variant
(字符) 22 个字节加字符串长度 与变长 String 有相同的范围
用户自定义
(利用 Type) 所有元素所需数目 每个元素的范围与它本身的数据类型的范围相同。
-------------
你说20亿字节是多少GB?用计算器算一下吧
String
(变长) 10 字节加字符串长度 0 到大约 20 亿
==========================================
2GB在这里多谢各位的帮助不过问题还是没有解决~上面提出用数组的方法我想过~不过我要将这个数现实出来,就要把他们加起来~一加起来~还不是一样溢出?
==================================
楼主好像还没有弄明白
用字符串做大数运算,参与运算的数和计算结果都是保存在字符串中
不会出现把整个结果直接转化为long或者double之类的操作
显示结果仅仅是输出一个字符串而已,怎么会溢出呢
用字符串做大数运算,参与运算的数和计算结果都是保存在字符串中
不会出现把整个结果直接转化为long或者double之类的操作
显示结果仅仅是输出一个字符串而已,怎么会溢出呢
=========================================
字符串不能运算啊~~
硅晶做的电脑反而做不到吗?
//
哈哈,经典!!!
\\
fxy_2002(阿勇)的星星
//
对哦,阿勇什么时候变猩猩了啊!!都不散点分来~~~
大伙再大方点,过两天偶就有两只猩猩了。:)VB版还有个阿勇,与我无关。此阿勇非彼阿勇!:-P
我这个阿勇就不行了!
-------------
楼主,我写个最简单的字符串加法运算
Private Sub Form_Load()
'一个简的大数加法,没有详细考虑,可能不周全
Dim str1 As String, str2 As String, strResult As String
Dim tmp1 As Integer, tmp2 As Integer, flag As Integer, l As Long
Dim i As Long
str1 = "11123345643653464564364368"
str2 = "17867888888888889"
l = IIf(Len(str1) > Len(str2), Len(str2), Len(str1))
i = l
Do While i > 0
tmp1 = Val(Mid(Right(str1, l), i, 1))
tmp2 = Val(Mid(Right(str2, l), i, 1))
strResult = CStr((tmp1 + tmp2 + flag) Mod 10) & strResult
i = i - 1
If tmp1 + tmp2 + flag > 9 Then flag = 1 Else flag = 0
Loop
If l < Len(str1) Then strResult = Mid(str1, 1, Len(str1) - l) & strResult
If l < Len(str2) Then strResult = Mid(str2, 1, Len(str2) - l) & strResult
Debug.Print strResult
End Sub
感谢两位啊勇拉~搞懂了~
不过啊勇的例子有一个BUG
当最大位相加大于10时(即i=1时),下一位就没有加1~~
^-^
不过已经懂了~~感谢~结贴~