论坛上看见有人问大数相加减乘除如何实现 正好之前似乎有看过这个算法 其实就是返璞归真 个十百千万从低位开始相加(此位不等于二进制位) 超过10的就进位 有了相加的算法 基本上相减 相乘的也就可以做出来了 相除的可能会难一点 不过总体上还是照着我们在小学里面学的思路来
public class BigInter
{
private string _strInt;
private int[] _intArr = null;
private int _length;
public BigInter(string strInt)
{
this._strInt = strInt;
var tempCharArray = this._strInt.ToCharArray();
this._length = tempCharArray.Count();
this._intArr = new int[tempCharArray.Length];
for (int i = 0; i < tempCharArray.Length; i++)
{
var currentStrNum = tempCharArray[i].ToString();
int intNum = 0;
if (int.TryParse(currentStrNum, out intNum))
{
_intArr[i] = intNum;
}
else
{
throw new ArgumentException(string.Format("输入数字在第{0}位不合法", i + 1));
}
}//将输入的字符串数字转化成int类型的数组
}
public static string Add(BigInter left, BigInter right)
{
var minLength = Math.Min(left._length, right._length);
var maxLength = Math.Max(left._length, right._length);
var theBiggerInter = left._length > right._length ? left._intArr : right._intArr;
var theSmallerInter = theBiggerInter==left._intArr ? right._intArr : left._intArr;
var tempSmaller = new int[maxLength];
for (int i = 0; i < maxLength; i++)
{
tempSmaller[i] = 0;
}
for (int i =0; i <minLength; i++)
{
tempSmaller[maxLength-i-1] = theSmallerInter[minLength-i-1];
}//以上两个循环将较小且数量级比较大数小的数的高位设为0
var resultIntArray = new int[maxLength + 1];
for (int i = maxLength; i > 0; i--)
{
var currentResult = theBiggerInter[i - 1] + tempSmaller[i - 1] + resultIntArray[i] ;
if (currentResult >= 10)
{
++resultIntArray[i-1];
resultIntArray[i] = currentResult - 10;
}
else
{
resultIntArray[i] = currentResult;
}//此处就是算法主要的地方 相同位相加 超过10则向上位进位 如果要做相减可以把这块用一个委托来表示 节省复制黏贴
//对于相乘则必须换思路 resultIntArray的元素数量应该是较大数元素数量的两倍 比如100*100=10000
}
StringBuilder result = new StringBuilder();//将最终结果输出
foreach (var temp in resultIntArray)
{
result.Append(temp.ToString());
}
return result.ToString();
}
}
调用的话也比较简单
class Program
{
static void Main(string[] args)
{
var left = new BigInter("9000000000000000000000000000000000");
var right = new BigInter("9000000000000000000000000000000000");
Console.Write(BigInter.Add(left, right));
Console.ReadLine();
}
}
估算一下算法时间复杂度 都是单重循环 所以可以肯定时间复杂度在O(N) 再看看空间利用 设想两个1000位的数字相加 需要3个包含1000个int元素的数组 也就是4byte*1000*3=12000byte 差不多是十几K的样子 如果追求极限的话可以把int数组换为byte或者char 计算的时候再转换为int 这样空间就用了1byte*1000*3差不多3K 还算是可以接受