欢迎访问binary的Blog   虚心使人进步,骄傲使人落后。

          W3CHINA Blog首页    管理页面    写新日志    退出



«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


登录

用户名称:
登陆密码:
密码保存:


联系我
email: binaryluo(at)gmail.com

我的分类

日志更新

最新评论

留言板

Blog信息

 
blog名称:二进制-虚心使人进步,骄傲使人落后。
日志总数:42
评论数量:370
留言数量:88
访问次数:640584
建立时间:2005年2月19日




[C / C++][讨论]用C实现大数类型
原创空间,  软件技术

binaryluo 发表于 2005/11/8 13:28:00

在java里有一个类BigInteger可以提供了对任意大(位数大)的整数的各种运算操作,现在想自己在c里实现一个有相同功能的类型以供喜欢用c的程序员使用。 我初想了一下:首先应该建立一个数据类型用来保存大数,然后再定义该大数类型上的各种运算。但是因为比如在乘方运算的时候如果算法设计的不好的话感觉一个乘方运算会很慢,所以想跟大家讨论下。下面是我自己设想的数据结构和一些操作:----------------------typedef unsigned char elemType; typedef struct BigInt{      elemType num;             //存一位数字      struct BigInt *next;       //指向下一位数字}BigInt, *BigInteger;----------------------加法:有四个变量,分别申明如下:a            //被加数b           //加数sum       //和ar          //进位初值都为0;1。从被加数和加数中分别取一位数字(0-9)出来赋值给a和b;2。让a与b,ar相加,结果存放在sum中;3。如果sum的值大于a或b中任何一个数(说明没进位),ar置0;否则有进位,ar置1;4。如果被加数或加数中有一个的位数已经加完,则结束;否则继续1-3。 加法示例:add("15", "16")第一趟:a=5, b=6, sum=1, ar=1第二趟:a=1, b=1, sum=3, ar=0结果:"31"。 --------------------其他运算主要都是基于上述加法来实现的,因为各种运算都可以转化成“加”运算。下面介绍下乘法:n           //乘数product  //乘积初值都为0;n = 乘数for i: 0 to n    product = add(product, 被乘数); 乘法实例:mul("15"," 2")n=2product=0第一趟:add(0, "15")  product="15"第二趟:add("15", "15") product="30"第三趟:add("30", "15") product="45" ----------------------其他运算实现思路类似乘法。问题:在乘法里遇到一个问题就是“for i: 0 to n”里n肯定只能是c里提供的整型数据类型,所以这里有限制,还请大家讨论下如何解决? 


阅读全文(2359) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144790787 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号