在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里提供的整型数据类型,所以这里有限制,还请大家讨论下如何解决?
|